作业二边缘检测,计算机视觉,高斯一阶导数滤波器,梯度,非极大值抑制,设置阈值并连接这里写自定义目录标题)
img=imread(‘4.2.07.tiff’);
img = double(rgb2gray(img));
figure(‘name’,‘原图’); %窗口
imshow(img,[]);%double类型数据在imshow函数里默认为0~1范围内,数值超过1的重置为白色,所以显示出来的是黑白图像。
%imshow(I,[ ])的意思相当于imshow(I,[min(I(😃) max(I(😃)])I中数值最大值与最小值分别为255和0。图像就可以正常显示了
title(‘Original’); %标题
%设计高斯一阶导数滤波器
sigma=0.5;
width=2sigma3+1;
x=[-1 0 1;-1 0 1;-1 0 1];
y=[-1 -1 -1;0 0 0;1 1 1];
gd = -(x/(2pisigma^4)).*exp(-(x.*x + y.y)./(2sigma^2)); %对G(x,y)对x求偏导, gd’就是对x求偏导
figure(‘name’,‘高斯一阶导数滤波器’);
imagesc(gd);
title(‘gd’);
%计算梯度
im_dy = imfilter(double(img), gd, ‘conv’);
im_dx = imfilter(double(img), gd’, ‘conv’);
%计算梯度幅度
img_grad_mag=sqrt(im_dx.^2 + im_dy.^2);
figure(‘name’,‘梯度幅度’);
imagesc(img_grad_mag)
title(‘梯度幅度’);
%计算梯度方向每一像素点的方向量化到 0,±pi/4 ,±pi/2,3pi/2,pi
img_grad_or=atan2(im_dy,im_dx);
img_grad_or=round(img_grad_or./(pi/4)).*(pi/4);%对img_grad_or逐点除以pi/4,利用round取整,再逐点乘以pi/4完成量化
figure(‘name’,‘梯度方向’);
imagesc(img_grad_or);
title(‘梯度方向’);
%执行非极大值抑制,对于每个像素点沿梯度方向找到相邻两个像素,比较它们的幅度值,如果该点大于两邻点,则不变,若小于,则不变
NMS = zeros(512,512);
for y = 2:511
for x = 2:511 %是从2-511,而不是1-512,因为要比较x-1/x+1,y-1/y+1
%比较←→方向像素
if (img_grad_or(x,y) == 0 || img_grad_or(x,y) == pi)
if (img_grad_mag(x,y) >= (img_grad_mag(x,y-1)||img_grad_mag(x,y) >=img_grad_mag(x,y+1)))
NMS(x,y) = img_grad_mag(x,y);
else
NMS(x,y) = 0;
end
%比较↑↓方向像素
elseif (abs(img_grad_or(x,y)) == pi/2|| img_grad_or(x,y) == -pi/2)
if (img_grad_mag(x,y) >= (img_grad_mag(x-1,y)||img_grad_mag(x,y) >=img_grad_mag(x+1,y)))
NMS(x,y) = img_grad_mag(x,y);
else
NMS(x,y) = 0;
end
%%比较↗↙方向像素
elseif (img_grad_or(x,y) == pi/4 || img_grad_or(x,y) == -3pi/4)
if (img_grad_mag(x,y) >= (img_grad_mag(x-1,y+1)||img_grad_mag(x,y) >=img_grad_mag(x+1,y-1)))
NMS(x,y) = img_grad_mag(x,y);
else
NMS(x,y) = 0;
end
%%比较↖↘方向像素
elseif (img_grad_or(x,y) == 3pi/4 || img_grad_or(x,y) == -pi/4)
if (img_grad_mag(x,y) >= max(img_grad_mag(x-1,y-1),img_grad_mag(x+1,y+1)))
NMS(x,y) = img_grad_mag(x,y);
else
NMS(x,y) = 0;
end
end
end
end
figure(‘name’,‘非极大值抑制’);
imagesc(NMS);
title(‘非极大值抑制’);
%设置阈值并连接
thresh_high = 10;
thresh_low = 2;
img_thresh_high = double(NMS > thresh_high);
img_thresh_low = double(NMS > thresh_low);
for y = 2:511
for x = 2:511
if (img_thresh_high(x,y)==1)
if (img_grad_or(x,y) == 0)
img_thresh_high(x,y+1) = img_thresh_low(x,y+1);
elseif (img_grad_or(x,y) == pi)
img_thresh_high(x,y-1) = img_thresh_low(x,y-1);
elseif (img_grad_or(x,y) == pi/4)
img_thresh_high(x-1,y+1) = img_thresh_low(x-1,y+1);
elseif (img_grad_or(x,y) == -pi/4)
img_thresh_high(x+1,y+1) = img_thresh_low(x+1,y+1);
elseif (img_grad_or(x,y) == pi/2)
img_thresh_high(x-1,y) = img_thresh_low(x-1,y);
elseif (img_grad_or(x,y) == 3pi/4)
img_thresh_high(x-1,y-1) = img_thresh_low(x-1,y-1);
elseif (img_grad_or(x,y) == -3pi/4)
img_thresh_high(x+1,y-1) = img_thresh_low(x+1,y-1);
elseif (img_grad_or(x,y) == -pi/2)
img_thresh_high(x+1,y) = img_thresh_low(x+1,y);
end
end
end
end
BW1 = img_thresh_high;
%canny边缘检测
BW2=edge(img,‘canny’);
figure(‘name’,‘canny算子比较’);
imshowpair(BW1, BW2, ‘montage’);
title(‘canny算子比较’);