使用roberts算子对图像进行边缘检测,并二值化的matlab代码实现

对一幅灰度图像进行边缘检测、二值化,这里使用roberts算子,程序如下:

%%使用梯度算子实现边缘检测
%%使用matlab自带的函数进行边缘检测
clear all;
I = imread('rice.png'); %导入图像
imshow(I), title('none');%显示原图
G = edge(I, 'roberts');%应用罗伯特算子对像进行边缘检测,并进行二值化
figure, imshow(G), title('roberts');
%%另有博客主给出的MATLAB实现五种边缘检测Matlab图像二值化,hen有参考意义

%%自己编码,先卷积检测边缘(使用roberts算子),再将图像二值化

myF = I;

%卷积操作,先补零
myF(:, size(I, 2) + 1) = 0;
myF(size(I, 1) + 1, :) = 0;
%进行卷积检测边缘
P = ones(size(I, 1) + 1, size(I, 2) + 1);
for i = 1:size(I, 1)
    for j = 1:size(I, 2)
        P(i, j) = P(i, j) + abs(myF(i + 1, j + 1) -myF(i, j)) + abs(myF(i +1, j) - myF(i, j + 1));
    end
end
P = P(1:size(I, 1), 1:size(I, 2));
figure, imshow(P, []), title('梯度图像');

%二值化操作
%先统计0到255灰度级对应的像素个数  
L = zeros(1, 256);  
for i = 1:size(P, 1)  
    for j = 1:size(P, 2)  
       for k = 0:255  
            if P(i, j) == k  
                L(k+1) = L(k+1) + 1;  
           end  
        end  
    end  
end  
%绘制I的灰度直方图  
figure, bar(0:255, L);  
axis([0,255,0,1650]);%设置坐标轴x和y的范围——x从0到255,y从0到1650
%%取谷底的灰度级45为二值化阈值
for i = 1:size(P, 1)  
    for j = 1:size(P, 2)  
        if P(i, j) <= 45  
            P(i, j) = 0;
        else
            P(i, j) = 1;
        end
    end  
end  

figure, imshow(P, []), title('二值化图像');%输出二值化图像

结果展示:

原图:                                                                使用matlab自带函数进行的边缘检测结果:

 

自己使用roberts算子卷积后得到的梯度图像:

统计的灰度直方图,大约在45灰度级处取到谷底:


对梯度图像二值化得到的结果:



自己编码得到的边缘检测结果与matlab自带函数进行的边缘检测结果略有不同。。。

猜你喜欢

转载自blog.csdn.net/qq_38327353/article/details/80151841