sum = sum + conv(i,j);
end
end
conv = conv./sum;%标准化
%对图像实施高斯滤波
for i = 1:height
for j = 1:width
sum = 0;%临时变量
for k = 1:5
for m = 1:5
if (i - 3 + k) > 0 && (i - 3 + k)0 && (j - 3 + m)abs(gradX)
weight = abs(gradX) / abs(gradY);%权重
grad2 = d(i - 1,j);
grad4 = d(i + 1,j);
%如果x、y方向导数符号相同
%像素点位置关系
%g1 g2
%C
%g4 g3
if gradX * gradY > 0
grad1 = d(i - 1,j - 1);
grad3 = d(i + 1,j + 1);
else
%如果x、y方向导数符号反
%像素点位置关系
%g2 g1
%C
%g3 g4
grad1 = d(i - 1,j + 1);
grad3 = d(i + 1,j - 1);
end
%如果X方向幅度值较大
else
weight = abs(gradY) / abs(gradX);%权重
grad2 = d(i,j - 1);
grad4 = d(i,j + 1);
%如果x、y方向导数符号相同
%像素点位置关系
%g3
%g4 C g2
%g1
if gradX * gradY > 0
grad1 = d(i + 1,j + 1);
grad3 = d(i - 1,j - 1);
else
%如果x、y方向导数符号反
%像素点位置关系
%g1
%g4 C g2
%g3
grad1 = d(i - 1,j + 1);
grad3 = d(i + 1,j - 1);
end
end
%利用grad1-grad4对梯度进行插值
gradTemp1 = weight * grad1 + (1 - weight) * grad2;
gradTemp2 = weight * grad3 + (1 - weight) * grad4;
%当前像素的梯度是局部的最大值,可能是边缘点
if gradTemp >= gradTemp1 && gradTemp >= gradTemp2
K(i,j) = gradTemp;
else
%不可能是边缘点
K(i,j) = 0;
end
end
end
end
figure,imshow(K,[])
title('非极大值抑制后的结果')
%定义双阈值:EP_MIN、EP_MAX,且EP_MAX = 2 * EP_MIN
EP_MIN = 12;
EP_MAX = EP_MIN * 2;
EdgeLarge = zeros(height,width);%记录真边缘
EdgeBetween = zeros(height,width);%记录可能的边缘点
for i = 1:height
for j = 1:width
if K(i,j) >= EP_MAX%小于小阈值,不可能为边缘点
EdgeLarge(i,j) = K(i,j);
else if K(i,j) >= EP_MIN
EdgeBetween(i,j) = K(i,j);
end
end
end
end
%把EdgeLarge的边缘连成连续的轮廓
MAXSIZE = ;
Queue = zeros(MAXSIZE,2);%用数组模拟队列
front = 1;%队头
rear = 1;%队尾
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-33947-2.html
三小只太棒了
因此广得民心
fightordie