%%%%%%%产生sobel算子%%%%%%
%%%%%%%by mqzz
%%%梯度算子,一阶导数,一阶差分,有方向的,故有水平和垂直两个模板
%%%此程序缺点:对边缘和背景做了最粗糙处理,还可以细化.
clc
clear
X=imread('original_lena.bmp');
figure,imshow(X);title('原始图');
[ROW,COL]=size(X);
%%%这步是有用的,保证W行列与原始一致.
W=zeros(ROW,COL);
X=double(X);
%%%从第2行,第2列开始,到倒数第2行,倒数第2列
for i=2:ROW-1
for j=2:COL-1
%%%%Dx是检测水平边缘的,则它的梯度方向是垂直的,这是对X的偏导数.
Dx=X(i+1,j-1)+2*X(i+1,j)+X(i+1,j+1)-X(i-1,j-1)-2*X(i-1,j)-X(i-1,j+1);
%%%%Dy是检测垂直边缘的,则它的梯度方向是水平的,这是对Y的偏导数.
Dy=X(i-1,j+1)+2*X(i,j+1)+X(i+1,j+1)-X(i-1,j-1)-2*X(i,j-1)-X(i+1,j-1);
%%%梯度的幅值
Mag=sqrt(Dx*Dx+Dy*Dy);
%%%梯度的方向角,Dy有取0的可能.
%%%a(i,j)=round(180*(atan(Dx/Dy)));
%%%梯度取整赋值给输出图像Wanted=W;
W(i,j)=round(Mag);
end
end
%%%阈值人为设定,随不同图像,不同目的改变.
t=input('please input your threshold(0<t<=255):');
%%%最粗糙做法,大于阈值认为是边缘,设为最亮;小于则为背景,最黑
for i=1:ROW
for j=1:COL
if W(i,j)>t
W(i,j)=255;
else
W(i,j)=0;
end
end
end
figure,imshow(W);title('sobel边检图');
- 1
- 2
- 3
- 4
- 5
- 6
前往页