作业二边缘检测,计算机视觉,高斯一阶导数滤波器,梯度,非极大值抑制,设置阈值并连接

作业二边缘检测,计算机视觉,高斯一阶导数滤波器,梯度,非极大值抑制,设置阈值并连接这里写自定义目录标题)

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) == 3
pi/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) == -3
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);
end
end
end
end
BW1 = img_thresh_high;

%canny边缘检测
BW2=edge(img,‘canny’);
figure(‘name’,‘canny算子比较’);
imshowpair(BW1, BW2, ‘montage’);
title(‘canny算子比较’);

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值