对一幅灰度图像进行边缘检测、二值化,这里使用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自带函数进行的边缘检测结果略有不同。。。