检测图像中的边缘
利用方向梯度模板的基本思想,可以设计检测不同方向线的方向模板。对于单像素宽度线,可通过阈值检测其梯度来完成线的检测,并确定其走向。线检测模板如下所示:
计算
),(),(),(*j i j i k j i k Z W R =, k =1,2,3,4. 其中),(j i Z 是原图像中以(i,j)为中心的一个3×3小矩阵,“*”是对应元素相乘并相加。如果原图像中(i,j)像素不为0,且),(),(j i l j i k R R >, 对所有的l k ≠, 则可以说该点的方向与k W 方向一致。
%Matlab 程序-检测图像中的边缘
%使用线检测模板
clc
clear
A=imread('22.png'); %读入彩色图像,图像存放在Matlab 工作路径下
B=rgb2gray(A); %将彩色图像转为灰度图像
C=im2bw(B); %将灰度图像转为2值图像
subplot(1,2,1); %子图
imshow(C); %绘图
[m,n]=size(C);
W=zeros(3,3,4);
W(:,:,1)=[-1 -1 -1; 2 2 2; -1 -1 -1]; %竖直方向模板
W(:,:,2)=[-1 -1 2; -1 2 -1; 2 -1 -1]; %45度方向模板
W(:,:,3)=[-1 2 -1; -1 2 -1; -1 2 -1]; %水平方向模板
W(:,:,4)=[2 -1 -1; -1 2 -1; -1 -1 2]; %-45度方向模板
D=zeros(m,n); %产生全0矩阵D ,保存检测结果;如果D(i,j)为0,则该点不是边缘;为1则是竖直方向边缘;为2则是45度方向边缘;为3则是水平方向边缘;为4则是-45度方向边缘 R=zeros(4,1);
M=zeros(3,3);
for i=2:m-1
for j=2:n-1
if(C(i,j))
M(:,:)=C(i-1:i+1, j-1:j+1); %取出以i,j 为中心,大小为3*3的子矩阵 for k=1:4
R(k)=sum(sum(W(:,:,k).*M)); %与方向模板做卷积运算 end
[R,Ri]=sort(R); %排序
if(R(end)>R(end-1)) %如果最大值比次大值还大,则认为该点的方向是最大值所对应的模板方向
D(i,j)=Ri(end);
end
end
end
end
%%由检测结果D构建边缘图像E
E=zeros(m,n);
for i=2:m-1
for j=2:n-1
if(D(i,j)>0)
E(i-1:i+1, j-1:j+1) = W(:,:,D(i,j))+1;
end
end
end
subplot(1,2,2);
imshow(logical(E));%绘边缘图像
结果示例: