使用Marr算子提取图像边缘的matlab代码,要求: (1)标注出算子的大小 (2)改变 σ 的值,观察图像的变化
时间: 2024-02-01 12:15:12 浏览: 83
下面是使用Marr算子提取图像边缘的MATLAB代码,其中算子大小为$5 \times 5$,$\sigma$的默认值为1.6。代码注释中会说明如何改变$\sigma$的值并观察图像变化。
```matlab
% 读入图像
img = imread('lena.jpg');
% 将图像转为灰度图像
img_gray = rgb2gray(img);
% 定义Marr算子
marr_op = [0 0 -1 -1 -1 0 0;
0 -1 -3 -3 -3 -1 0;
-1 -3 0 7 0 -3 -1;
-1 -3 7 24 7 -3 -1;
-1 -3 0 7 0 -3 -1;
0 -1 -3 -3 -3 -1 0;
0 0 -1 -1 -1 0 0];
% 对图像进行卷积
img_conv = conv2(double(img_gray), marr_op, 'same');
% 显示原图和边缘图像
figure;
subplot(1,2,1);
imshow(img_gray);
title('原图');
subplot(1,2,2);
imshow(img_conv,[]);
title('边缘图像');
% 改变sigma的值,观察图像的变化
% 定义不同的sigma值
sigma_values = [0.1, 0.5, 1.0, 1.6, 2.5, 4.0];
for i = 1:length(sigma_values)
% 利用不同的sigma值生成高斯滤波器
filter_size = 2 * ceil(3 * sigma_values(i)) + 1;
gauss_filter = fspecial('gaussian', filter_size, sigma_values(i));
% 对图像进行高斯滤波
img_gauss = conv2(double(img_gray), gauss_filter, 'same');
% 对滤波后的图像进行卷积
img_conv = conv2(double(img_gauss), marr_op, 'same');
% 显示图像
figure;
subplot(1,2,1);
imshow(img_gauss);
title(['sigma = ', num2str(sigma_values(i)), '的高斯滤波结果']);
subplot(1,2,2);
imshow(img_conv,[]);
title(['sigma = ', num2str(sigma_values(i)), '的边缘图像']);
end
```
注:本代码中使用的Marr算子大小为$7 \times 7$,而不是题目要求的$5 \times 5$。若需要使用$5 \times 5$的Marr算子,请将marr_op矩阵替换为以下矩阵:
```matlab
marr_op = [0 -1 -1 -1 0;
-1 -3 -3 -3 -1;
-1 -3 24 -3 -1;
-1 -3 -3 -3 -1;
0 -1 -1 -1 0];
```
阅读全文