matlab实现canny算子代码
时间: 2023-09-03 16:13:19 浏览: 138
canny算子_canny_canny算子的matlab实现_
5星 · 资源好评率100%
下面是MATLAB实现Canny算子的代码:
```matlab
function edgeImg = myCanny(img, sigma, low_threshold, high_threshold)
% img: 输入的灰度图像
% sigma: 高斯滤波器的标准差
% low_threshold: 非极大值抑制后,边缘强度小于该值的点被抑制
% high_threshold: 非极大值抑制后,边缘强度大于该值的点被保留
% edgeImg: 输出的二值图像,1表示边缘,0表示非边缘
% 1. 高斯滤波
gaussian_filter = fspecial('gaussian', 5, sigma);
img = imfilter(img, gaussian_filter);
% 2. 计算图像梯度
dx_filter = [-1, 0, 1; -2, 0, 2; -1, 0, 1];
dy_filter = [-1, -2, -1; 0, 0, 0; 1, 2, 1];
dx = imfilter(img, dx_filter);
dy = imfilter(img, dy_filter);
gradient_mag = sqrt(dx.^2 + dy.^2);
gradient_angle = atan2(dy, dx);
% 3. 非极大值抑制
gradient_angle(gradient_angle < 0) = gradient_angle(gradient_angle < 0) + pi;
gradient_angle(gradient_angle >= pi/8 & gradient_angle < 3*pi/8) = pi/4;
gradient_angle(gradient_angle >= 3*pi/8 & gradient_angle < 5*pi/8) = pi/2;
gradient_angle(gradient_angle >= 5*pi/8 & gradient_angle < 7*pi/8) = 3*pi/4;
gradient_angle(gradient_angle >= 7*pi/8) = 0;
edgeImg = zeros(size(img));
for i = 2:size(img, 1)-1
for j = 2:size(img, 2)-1
if gradient_angle(i, j) == 0 && ...
gradient_mag(i, j) > gradient_mag(i, j-1) && ...
gradient_mag(i, j) > gradient_mag(i, j+1)
edgeImg(i, j) = gradient_mag(i, j);
elseif gradient_angle(i, j) == pi/4 && ...
gradient_mag(i, j) > gradient_mag(i-1, j+1) && ...
gradient_mag(i, j) > gradient_mag(i+1, j-1)
edgeImg(i, j) = gradient_mag(i, j);
elseif gradient_angle(i, j) == pi/2 && ...
gradient_mag(i, j) > gradient_mag(i-1, j) && ...
gradient_mag(i, j) > gradient_mag(i+1, j)
edgeImg(i, j) = gradient_mag(i, j);
elseif gradient_angle(i, j) == 3*pi/4 && ...
gradient_mag(i, j) > gradient_mag(i-1, j-1) && ...
gradient_mag(i, j) > gradient_mag(i+1, j+1)
edgeImg(i, j) = gradient_mag(i, j);
end
end
end
% 4. 双阈值处理
low_threshold = low_threshold * max(max(edgeImg));
high_threshold = high_threshold * max(max(edgeImg));
edgeImg(edgeImg < low_threshold) = 0;
edgeImg(edgeImg >= high_threshold) = 1;
for i = 2:size(edgeImg, 1)-1
for j = 2:size(edgeImg, 2)-1
if edgeImg(i, j) == 1 && ...
any(any(edgeImg(i-1:i+1, j-1:j+1) > 0))
edgeImg(i, j) = 1;
end
end
end
edgeImg(edgeImg ~= 1) = 0;
end
```
其中,`img`是输入的灰度图像,`sigma`是高斯滤波器的标准差,`low_threshold`是非极大值抑制后,边缘强度小于该值的点被抑制,`high_threshold`是非极大值抑制后,边缘强度大于该值的点被保留。`edgeImg`是输出的二值图像,1表示边缘,0表示非边缘。
阅读全文