Canny算子代码matlab代码
时间: 2023-12-18 13:03:53 浏览: 35
以下是Canny算子的Matlab代码示例:
```matlab
% 读取图像
img = imread('image.jpg');
% 转换为灰度图像
gray_img = rgb2gray(img);
% 应用高斯滤波器
gauss_img = imgaussfilt(gray_img, 1.5);
% 计算梯度幅值和方向
[grad_mag, grad_dir] = imgradient(gauss_img);
% 应用非极大值抑制
nms_img = imhmax(grad_mag, 0);
% 应用双阈值边缘检测
low_thresh = 0.1 * max(nms_img(:));
high_thresh = 0.2 * max(nms_img(:));
edge_img = edge(nms_img, 'canny', [low_thresh high_thresh]);
% 显示结果
imshow(edge_img);
```
注意,这只是一个简单的示例代码,您可能需要根据您的具体需求进行调整和修改。
相关问题
matlab实现canny算子代码
下面是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表示非边缘。
Canny算子锐化matlab的程序
以下是使用Canny算子进行图像锐化的MATLAB代码示例:
```matlab
% 读取图像
img = imread('image.jpg');
% 将图像转换为灰度图像
gray_img = rgb2gray(img);
% 使用Canny算子进行边缘检测
canny_img = edge(gray_img, 'canny');
% 将边缘图像与原始图像进行加权融合,得到锐化后的图像
sharp_img = imadd(im2double(img), canny_img);
% 显示结果
subplot(1,2,1), imshow(img), title('原始图像');
subplot(1,2,2), imshow(sharp_img), title('锐化后的图像');
```
在上述代码中,首先读取原始图像,并将其转换为灰度图像。然后使用MATLAB内置的`edge`函数,选择Canny算子进行边缘检测。接着将边缘图像与原始图像进行加权融合,得到锐化后的图像。最后使用`subplot`函数将原始图像和锐化后的图像显示在同一窗口中。