改进的canny边缘检测算法matlab代码
时间: 2023-10-04 22:06:47 浏览: 117
下面是改进的Canny边缘检测算法的Matlab代码:
```matlab
function edge_img = my_canny(img, sigma, low_threshold, high_threshold)
% 高斯滤波
filter_size = 2 * ceil(2 * sigma) + 1;
gauss_filter = fspecial('gaussian', filter_size, sigma);
img_filtered = imfilter(img, gauss_filter);
% 计算梯度幅值和方向
hx = [-1, 0, 1; -2, 0, 2; -1, 0, 1];
hy = [-1, -2, -1; 0, 0, 0; 1, 2, 1];
gx = imfilter(img_filtered, hx);
gy = imfilter(img_filtered, hy);
grad_mag = sqrt(gx .^ 2 + gy .^ 2);
grad_dir = atan2(gy, gx) * 180 / pi;
grad_dir(grad_dir < 0) = grad_dir(grad_dir < 0) + 180;
% 非极大值抑制
grad_mag_pad = padarray(grad_mag, [1, 1], 'replicate');
grad_dir_pad = padarray(grad_dir, [1, 1], 'replicate');
grad_mag_suppressed = zeros(size(grad_mag));
for i = 2:size(grad_mag_pad, 1)-1
for j = 2:size(grad_mag_pad, 2)-1
if grad_dir_pad(i, j) >= 0 && grad_dir_pad(i, j) < 22.5 || grad_dir_pad(i, j) >= 157.5 && grad_dir_pad(i, j) < 202.5 || grad_dir_pad(i, j) >= 337.5 && grad_dir_pad(i, j) <= 360 || grad_dir_pad(i, j) >= 0 && grad_dir_pad(i, j) < 22.5+180 || grad_dir_pad(i, j) >= 157.5+180 && grad_dir_pad(i, j) < 202.5+180 || grad_dir_pad(i, j) >= 337.5+180 && grad_dir_pad(i, j) <= 360+180
if grad_mag_pad(i, j) >= grad_mag_pad(i-1, j) && grad_mag_pad(i, j) >= grad_mag_pad(i+1, j)
grad_mag_suppressed(i-1, j-1) = grad_mag_pad(i, j);
end
elseif grad_dir_pad(i, j) >= 22.5 && grad_dir_pad(i, j) < 67.5 || grad_dir_pad(i, j) >= 202.5 && grad_dir_pad(i, j) < 247.5 || grad_dir_pad(i, j) >= 22.5+180 && grad_dir_pad(i, j) < 67.5+180 || grad_dir_pad(i, j) >= 202.5+180 && grad_dir_pad(i, j) < 247.5+180
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)
grad_mag_suppressed(i-1, j-1) = grad_mag_pad(i, j);
end
elseif grad_dir_pad(i, j) >= 67.5 && grad_dir_pad(i, j) < 112.5 || grad_dir_pad(i, j) >= 247.5 && grad_dir_pad(i, j) < 292.5 || grad_dir_pad(i, j) >= 67.5+180 && grad_dir_pad(i, j) < 112.5+180 || grad_dir_pad(i, j) >= 247.5+180 && grad_dir_pad(i, j) < 292.5+180
if grad_mag_pad(i, j) >= grad_mag_pad(i, j-1) && grad_mag_pad(i, j) >= grad_mag_pad(i, j+1)
grad_mag_suppressed(i-1, j-1) = grad_mag_pad(i, j);
end
elseif grad_dir_pad(i, j) >= 112.5 && grad_dir_pad(i, j) < 157.5 || grad_dir_pad(i, j) >= 292.5 && grad_dir_pad(i, j) < 337.5 || grad_dir_pad(i, j) >= 112.5+180 && grad_dir_pad(i, j) < 157.5+180 || grad_dir_pad(i, j) >= 292.5+180 && grad_dir_pad(i, j) < 337.5+180
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)
grad_mag_suppressed(i-1, j-1) = grad_mag_pad(i, j);
end
end
end
end
% 双阈值检测
high_threshold = max(max(grad_mag_suppressed)) * high_threshold;
low_threshold = high_threshold * low_threshold;
edge_img = zeros(size(grad_mag_suppressed));
for i = 1:size(grad_mag_suppressed, 1)
for j = 1:size(grad_mag_suppressed, 2)
if grad_mag_suppressed(i, j) >= high_threshold
edge_img(i, j) = 1;
elseif grad_mag_suppressed(i, j) >= low_threshold
if any(any(grad_mag_suppressed(max(i-1,1):min(i+1,end),max(j-1,1):min(j+1,end))>=high_threshold))
edge_img(i, j) = 1;
end
end
end
end
end
```
其中,`img`为输入灰度图像,`sigma`为高斯滤波的标准差,`low_threshold`和`high_threshold`分别为双阈值检测的低阈值和高阈值。函数返回二值化边缘图像`edge_img`。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)