使用Roberts算子进行图像分割(Matlab自编程实现)

首先了解一下何为边缘,“边缘”可定义为图像局部区域特征不相同的那些区域间的分界线,而“线”则可以认为是具有很小宽度的其中间区域具有相同的图像特征的边缘对。
常用边缘提取方法有差分算子、拉普拉斯算手、LOG算子等 。常用的一阶差分算子有Roberts交叉梯度算子、Prewitt梯度算子、Sobel梯度算子,下面介绍Roberts算子。

Roberts交叉梯度算子模板为:
在这里插入图片描述
我们可以用街区距离计算梯度幅值。
在这里插入图片描述
编程代码:
Roberts.m :输入参数为灰度图像

function Roberts(I_in)
    figure(1),subplot(121),imshow(I_in),title('原图');
    [row,col] = size(I_in);
    I=double(I_in);
    I(:, size(I_in, 2) + 1) = 195;
    I(size(I_in, 1) + 1, :) = 195;

    g = zeros(row,col);
    g_x=zeros(row,col);  % 水平方向
    g_y=zeros(row,col);  % 垂直方向

    for i=1:row
        for j=1:col
            x=abs(I(i+1,j+1)-I(i,j));
            y=abs(I(i+1,j)-I(i,j+1));
            sum=x+y;
            g(i,j) = sum;
            g_x(i,j)=x;
            g_y(i,j)=y;
        end
    end


    NumPixel = zeros(1,400);  % 建立一个256列的行向量,以统计各灰度级的像素个数
    for i = 1 : row
        for j = 1 : col
            k = g(i,j);  % k是像素点(i,j)的灰度值
            NumPixel(k+1) = NumPixel(k+1) + 1;  % 对应灰度值像素点数量加1 
        end
    end

    figure(2),bar(NumPixel);  % 灰度图像的直方图
    figure(1),subplot(122),imshow(g,[]),title('卷积结果');

    I2=g;
    for i = 1 : row
        for j = 1 : col
            if I2(i,j) < 80
                I2(i,j) = 1;
            else
                I2(i,j) = 0;
            end
        end
    end


    figure(3),subplot(121),imshow(g_x,[]),title('水平边界检测结果');
    figure(3),subplot(122),imshow(g_y,[]),title('垂直边界检测结果');
    figure,imshow(I2),title('二值化图像');
end

在这里插入图片描述
图3.1-1 灰度分布直方图
在这里插入图片描述
图3.1-2 水平边界与垂直边界检测结果
在这里插入图片描述
图3.1-3 room原图与卷积结果
在这里插入图片描述
图3.1-4 结果二值化
可以看到,进行卷积后得到的图像灰度值大多集中在0-25之间,这是因为图像中边缘部分占的信息比较少,而平滑部分信息较多,当在梯度较小的区域做梯度幅值计算时,得到的结果会接近于0。从水平边界检测和垂直边界检测结果来看(见图3.1-2),可以看到Roberts算子对正45度和负45度的边缘检测效果较明显,其中水平方向检测正45度方向,垂直方向检测负45度方向。要注意的是,实验中发现当用uint8类型的矩阵来存储结果时,由于uint8类型存储的是0-255之间的值,而计算结果会大于255,此时会将大于255的值置为255,会造成一些信息丢失,得到的结果也不明显。对于水平和垂直的边缘,两个方向的检测结果都基本一致。
在对卷积结果进行二值化处理时,从灰度分布图中可以得到大概的最小值阈值(即该阈值往后的灰度分布较少),但是将这个值作为阈值得到的图像会有较多非边缘部分信息(如房顶部分),此时就需要增大阈值,以过滤这些非边缘信息。
加入高斯噪声之后(可自己将图片加入噪声后放入函数进行处理,这里没有将加入噪声的处理结果放上来),可以看到灰度值分布呈现很明显的正态分布,得到的卷积结果不理想,无论怎么调整阈值,噪声都会造成很大的影响。假如阈值过小,噪声会覆盖掉边缘信息,噪声过大则会将边缘部分过滤。罗伯特算法对于噪声较多的图片处理效果较差。

猜你喜欢

转载自blog.csdn.net/weixin_45750572/article/details/124758580