Matlab canny边缘提取算法
时间: 2023-05-29 19:07:30 浏览: 103
Canny边缘检测算法是一种经典的边缘检测算法,其主要步骤包括:
1. 高斯滤波:对图像进行高斯滤波,以去除噪声。
2. 计算梯度:对滤波后的图像进行梯度计算,以获取图像中每个像素的边缘强度和方向。
3. 非极大值抑制:对梯度图像进行非极大值抑制,以去除边缘中的非极大值点。
4. 双阈值检测:根据用户设定的两个阈值,将梯度图像中的像素分为强边缘、弱边缘和噪声三类,并将强边缘作为最终的边缘。
Matlab中可以通过以下代码实现Canny边缘检测:
```matlab
% 读取图像
img = imread('lena.jpg');
% 高斯滤波
sigma = 1.5; % 高斯核标准差
H = fspecial('gaussian', [5 5], sigma);
img_smooth = imfilter(img, H);
% 计算梯度
[Gx, Gy] = gradient(double(img_smooth));
grad_mag = sqrt(Gx.^2 + Gy.^2);
grad_dir = atan2(Gy, Gx) * 180 / pi;
% 非极大值抑制
grad_nms = zeros(size(grad_mag));
for i = 2:size(grad_mag, 1)-1
for j = 2:size(grad_mag, 2)-1
if grad_dir(i,j) >= -22.5 && grad_dir(i,j) < 22.5 % 水平
if grad_mag(i,j) >= grad_mag(i,j-1) && grad_mag(i,j) >= grad_mag(i,j+1)
grad_nms(i,j) = grad_mag(i,j);
end
elseif grad_dir(i,j) >= 22.5 && grad_dir(i,j) < 67.5 % 45度
if grad_mag(i,j) >= grad_mag(i-1,j-1) && grad_mag(i,j) >= grad_mag(i+1,j+1)
grad_nms(i,j) = grad_mag(i,j);
end
elseif grad_dir(i,j) >= -67.5 && grad_dir(i,j) < -22.5 % -45度
if grad_mag(i,j) >= grad_mag(i-1,j+1) && grad_mag(i,j) >= grad_mag(i+1,j-1)
grad_nms(i,j) = grad_mag(i,j);
end
else % 垂直
if grad_mag(i,j) >= grad_mag(i-1,j) && grad_mag(i,j) >= grad_mag(i+1,j)
grad_nms(i,j) = grad_mag(i,j);
end
end
end
end
% 双阈值检测
T1 = 0.1 * max(grad_nms(:));
T2 = 0.2 * max(grad_nms(:));
grad_thres = zeros(size(grad_nms));
grad_thres(grad_nms >= T2) = 1;
for i = 2:size(grad_nms, 1)-1
for j = 2:size(grad_nms, 2)-1
if grad_nms(i,j) >= T1 && grad_nms(i,j) < T2
if grad_nms(i-1,j-1) >= T2 || grad_nms(i-1,j) >= T2 || grad_nms(i-1,j+1) >= T2 || grad_nms(i,j-1) >= T2 || grad_nms(i,j+1) >= T2 || grad_nms(i+1,j-1) >= T2 || grad_nms(i+1,j) >= T2 || grad_nms(i+1,j+1) >= T2
grad_thres(i,j) = 1;
end
end
end
end
% 显示结果
figure;
subplot(1,2,1); imshow(img); title('原始图像');
subplot(1,2,2); imshow(grad_thres); title('边缘检测结果');
```