canny算子matlab实现
时间: 2023-06-01 13:03:53 浏览: 112
以下是使用Matlab实现canny算子的代码:
```matlab
function edgeImg = cannyEdgeDetection(img, sigma, lowThresh, highThresh)
% img: 输入的灰度图像
% sigma: 高斯滤波的标准差
% lowThresh, highThresh: 非极大值抑制和双阈值检测的阈值
% 高斯滤波
G = fspecial('gaussian', [5 5], sigma);
img_smooth = imfilter(img, G, 'same');
% 计算梯度幅值和方向
Gx = [-1 0 1; -2 0 2; -1 0 1];
Gy = [-1 -2 -1; 0 0 0; 1 2 1];
grad_x = imfilter(double(img_smooth), Gx);
grad_y = imfilter(double(img_smooth), Gy);
grad_mag = sqrt(grad_x.^2 + grad_y.^2);
grad_dir = atan2(grad_y, grad_x);
% 非极大值抑制
grad_mag_pad = padarray(grad_mag, [1 1], 0, 'both');
grad_dir_pad = padarray(grad_dir, [1 1], 0, 'both');
edgeImg = zeros(size(img));
for i = 2:size(grad_mag_pad, 1)-1
for j = 2:size(grad_mag_pad, 2)-1
if grad_dir_pad(i, j) >= -pi/8 && grad_dir_pad(i, j) < pi/8
if grad_mag_pad(i, j) > grad_mag_pad(i, j-1) && grad_mag_pad(i, j) > grad_mag_pad(i, j+1)
edgeImg(i-1, j-1) = grad_mag_pad(i, j);
end
elseif grad_dir_pad(i, j) >= pi/8 && grad_dir_pad(i, j) < 3*pi/8
if grad_mag_pad(i, j) > grad_mag_pad(i-1, j+1) && grad_mag_pad(i, j) > grad_mag_pad(i+1, j-1)
edgeImg(i-1, j-1) = grad_mag_pad(i, j);
end
elseif grad_dir_pad(i, j) >= -3*pi/8 && grad_dir_pad(i, j) < -pi/8
if grad_mag_pad(i, j) > grad_mag_pad(i-1, j-1) && grad_mag_pad(i, j) > grad_mag_pad(i+1, j+1)
edgeImg(i-1, j-1) = grad_mag_pad(i, j);
end
else
if grad_mag_pad(i, j) > grad_mag_pad(i-1, j) && grad_mag_pad(i, j) > grad_mag_pad(i+1, j)
edgeImg(i-1, j-1) = grad_mag_pad(i, j);
end
end
end
end
% 双阈值检测
highThresh = max(max(edgeImg)) * highThresh;
lowThresh = highThresh * lowThresh;
edgeImg(edgeImg < lowThresh) = 0;
edgeImg(edgeImg >= highThresh) = 1;
for i = 2:size(edgeImg, 1)-1
for j = 2:size(edgeImg, 2)-1
if edgeImg(i, j) == 1 && ...
(edgeImg(i-1, j-1)==0 || edgeImg(i-1, j)==0 || edgeImg(i-1, j+1)==0 || ...
edgeImg(i, j-1)==0 || edgeImg(i, j+1)==0 || ...
edgeImg(i+1, j-1)==0 || edgeImg(i+1, j)==0 || edgeImg(i+1, j+1)==0)
edgeImg(i, j) = 0;
end
end
end
end
```
使用方法如下:
```matlab
img = imread('test.jpg');
img_gray = rgb2gray(img);
edgeImg = cannyEdgeDetection(img_gray, 1.4, 0.1, 0.3);
imshow(edgeImg);
```
其中,sigma为高斯滤波的标准差,lowThresh和highThresh为双阈值检测的阈值,可以根据实际情况调整。
阅读全文