【实验五 图像的边缘检测和分割(综合性)】

一、实验目的

1.学会使用编程实现不同算法的边缘检测。
2.学会使用编程实现不同算法的图像分割。
3.能够根据实验结果分析各种算法的特点及其应用场合,培养处理实际图像的能力。

二、实验内容(每一个内容编写一个*.m文件)

1.边缘检测:
(1)利用边缘检测函数edge ()对灰度图像(house.tif)进行边缘检测,检测算子分别选择’roberts’、‘sobel’、‘prewitt’、LOG、‘Canny’(其他参数选择:default),比较不同检测算子对边缘检测的效果;
(2)利用工具箱函数imfilter()和如图1所示四种不同方向的线检测模板w1/w2/w3/w4对图像(Fig0908(a).tif)进行边缘检测,比较不同方向的检测算子对边缘检测的效果;

-1-2-1-101012-2-10
000-202-101-101
121-101-2-10012

图1 w1(水平) w2(垂直) w3 (+45°) w4(-45°)
对比:

  • w1(水平)模板能够很好地检测水平方向的边缘,但对垂直方向的边缘检测效果不佳;
  • w2(垂直)模板能够很好地检测垂直方向的边缘,但对水平方向的边缘检测效果不佳;
  • w3(+45°)模板能够很好地检测从左上到右下方向的边缘,但对从右上到左下方向的边缘检测效果不佳;
  • w4(-45°)模板能够很好地检测从右上到左下方向的边缘,但对从左上到右下方向的边缘检测效果不佳。

因此,选择合适的边缘检测算子需要根据实际情况和需求来进行选择。如果需要检测某个特定方向的边缘,可以选择对应方向的线检测模板;如果需要检测多个方向的边缘,则可以使用多个不同方向的线检测模板进行组合。

% 读取图像
img = imread('house.tif');
grayImg = img; % 图像已经是灰度图像

% 使用不同算子进行边缘检测
edge_roberts = edge(grayImg, 'roberts');
edge_sobel = edge(grayImg, 'sobel');
edge_prewitt = edge(grayImg, 'prewitt');
edge_log = edge(grayImg, 'log');
edge_canny = edge(grayImg, 'canny');

% 显示结果
figure(1);
subplot(2, 3, 1), imshow(edge_roberts), title('Roberts');
subplot(2, 3, 2), imshow(edge_sobel), title('Sobel');
subplot(2, 3, 3), imshow(edge_prewitt), title('Prewitt');
subplot(2, 3, 4), imshow(edge_log), title('LOG');
subplot(2, 3, 5), imshow(edge_canny), title('Canny');
subplot(2, 3, 6), imshow(grayImg), title('old');

% 读取图像
img = imread('Fig0908(a).tif');

% 定义四种不同方向的线检测模板
w1 = [-1 -2 -1; 0 0 0; 1 2 1];
w2 = [-1 0 1; -2 0 2; -1 0 1];
w3 = [0 1 2; -1 0 1; -2 -1 0];
w4 = [2 1 0; 1 0 -1; 0 -1 -2];

% 使用imfilter函数进行边缘检测
edge_w1 = imfilter(img, w1);
edge_w2 = imfilter(img, w2);
edge_w3 = imfilter(img, w3);
edge_w4 = imfilter(img, w4);

% 显示结果
figure(2);
subplot(2, 2, 1), imshow(edge_w1), title('w1 (水平)');
subplot(2, 2, 2), imshow(edge_w2), title('w2 (垂直)');
subplot(2, 2, 3), imshow(edge_w3), title('w3 (+45°)');
subplot(2, 2, 4), imshow(edge_w4), title('w4 (-45°)');

2.对灰度图像(rice.tif)编程实现图像锐化增强(算子如图2所示):
(1)利用robert算子检测图像边缘,并采用门限法得到锐化增强图像(T=10,T=50);
(2)利用sobel算子检测图像边缘并得到锐化增强图像;
(3)利用Laplacian算子检测图像边缘,分H1和H2两种情况,并得到锐化增强图像;
(4)比较采用不同边缘检测算子锐化增强图像的不同效果。

-100-1-101-1-2-1010111
0110-2020001-411-81
0000-101121010111

图2 robert算子 sobel算子 Laplacian算子

对比:

  • Robert算子:

Robert算子是一种简单的边缘检测算子,它通常能够提取出图像中的细微边缘特征。通过应用Robert算子进行锐化增强,可以得到边缘清晰但可能稍显粗糙的图像。

  • Sobel算子:

Sobel算子在边缘检测中表现较为出色,它能够平衡地提取水平和垂直方向的边缘特征。使用Sobel算子进行锐化增强可以得到清晰且相对平滑的边缘图像。

  • Laplacian算子:

Laplacian算子可以捕捉图像中的整体边缘特征,对于较大的边缘特征有较好的响应。使用Laplacian算子进行锐化增强可能会产生更加整体化的增强效果,能够突出整体的边缘信息。

% 读取图像
img = imread('rice.tif');

% (1) 利用robert算子检测图像边缘,并采用门限法得到锐化增强图像(T=10,T=50)
robert_edge_T10 = robert_operator(img, 10);
robert_edge_T50 = robert_operator(img, 50);

% (2) 利用sobel算子检测图像边缘并得到锐化增强图像
sobel_edge = sobel_operator(img);

% (3) 利用Laplacian算子检测图像边缘,分H1和H2两种情况,并得到锐化增强图像
laplacian_H1_edge = laplacian_operator_H1(img);
laplacian_H2_edge = laplacian_operator_H2(img);

% 显示结果
subplot(2, 3, 1), imshow(robert_edge_T10), title('Robert(T=10)');
subplot(2, 3, 2), imshow(robert_edge_T50), title('Robert(T=50)');
subplot(2, 3, 3), imshow(sobel_edge), title('Sobel');
subplot(2, 3, 4), imshow(laplacian_H1_edge), title('Laplacian (H1)');
subplot(2, 3, 5), imshow(laplacian_H2_edge), title('Laplacian (H2)');
subplot(2, 3, 6), imshow(img), title('old');

function edge_img = robert_operator(img, T)
    % Robert算子
    robert_w1 = [1 0; 0 -1];
    robert_w2 = [0 1; -1 0];

    % 计算Robert算子响应
    robert_resp = abs(imfilter(double(img), robert_w1)) + abs(imfilter(double(img), robert_w2));
    
    % 门限法得到锐化增强图像
    edge_img = img + uint8(robert_resp > T);
end

function edge_img = sobel_operator(img)
    % Sobel算子
    sobel_w1 = [-1 0 1; -2 0 2; -1 0 1];
    sobel_w2 = [-1 -2 -1; 0 0 0; 1 2 1];

    % 计算Sobel算子响应
    sobel_resp = sqrt(imfilter(double(img), sobel_w1).^2 + imfilter(double(img), sobel_w2).^2);
    
    % 归一化到[0,255]
    sobel_resp = sobel_resp / max(sobel_resp(:)) * 255;
    
    % 转换成uint8类型
    edge_img = uint8(sobel_resp);
end

function edge_img = laplacian_operator_H1(img)
    % Laplacian算子 H1
    laplacian_H1_w = [0 1 0; 1 -4 1; 0 1 0];

    % 计算Laplacian算子响应
    laplacian_resp_H1 = imfilter(double(img), laplacian_H1_w);
    
    % 归一化到[0,255]
    laplacian_resp_H1 = laplacian_resp_H1 / max(laplacian_resp_H1(:)) * 255;
    
    % 转换成uint8类型
    edge_img = uint8(laplacian_resp_H1);
end

function edge_img = laplacian_operator_H2(img)
    % Laplacian算子 H2
    laplacian_H2_w = [1 1 1; 1 -8 1; 1 1 1];

    % 计算Laplacian算子响应
    laplacian_resp_H2 = imfilter(double(img), laplacian_H2_w);
    
    % 归一化到[0,255]
    laplacian_resp_H2 = laplacian_resp_H2 / max(laplacian_resp_H2(:)) * 255;
    
    % 转换成uint8类型
    edge_img = uint8(laplacian_resp_H2);
end

3.对灰度图像(Fig1018(a).tif)实现基于阈值处理的图像分割(1为必做内容,2-4为选做内容):
(1)利用函数graythresh ()和otsuthresh()找到全局阈值,对图像进行分割;
(2)采用迭代阈值选取方法,编程实现基于图像数据自动地选择阈值,对图像进行全局阈值分割;
(3)使用Otsu阈值选取方法,编程实现对图像进行最佳全局阈值分割;
(4)比较迭代法和Otsu法两种不同的阈值处理方法对图像进行分割的效果。
对比:

  • 迭代法:该方法根据图像的均值进行分割。它在阈值选择上相对较简单,但可能对噪声敏感。因此,在有噪声存在的情况下,分割结果可能会受到噪声的影响,导致目标与背景之间的分割效果不理想。
  • Otsu法:该方法通过最大化类间方差来选择最优的全局阈值。它能够有效地将图像中的目标与背景分开,并对噪声相对较稳健。因此,Otsu法在处理具有较大灰度差异或存在噪声的图像时通常能够取得较好的分割效果。
clc;
clf;

I = imread("Fig1018(a).tif"); % 读取图像
figure(1);
imshow(I); % 显示原始图像

figure(2);
level1 = graythresh(I); % 计算基于Otsu方法的灰度图像全局阈值
counts = imhist(I);
level2 = otsuthresh(counts); % 计算基于Otsu方法的灰度图像全局直方图阈值

[wid1, len1] = size(I); % 获取图像的大小
I_double = im2double(I); % 将图像转换为double类型

% 利用函数graythresh()进行图像分割
BW1 = zeros(wid1, len1);
for i = 1:wid1
    for j = 1:len1
        if I_double(i, j) > level1 % 大于所设定的阈值则为目标
            BW1(i, j) = 0;
        else
            BW1(i, j) = 1;
        end
    end
end
subplot(1, 2, 1);
imshow(BW1);
title("利用函数graythresh()进行分割");

% 利用函数otsuthresh()进行图像分割
BW2 = zeros(wid1, len1);
for i = 1:wid1
    for j = 1:len1
        if I_double(i, j) > level2 % 大于所设定的阈值则为目标
            BW2(i, j) = 0;
        else
            BW2(i, j) = 1;
        end
    end
end
subplot(1, 2, 2);
imshow(BW2);
title("利用函数otsuthresh()进行分割");

三、问题与讨论

1.比较不同检测算子对灰度图像(‘house.tif’)边缘检测的效果有什么不同?
不同检测算子对灰度图像(‘house.tif’)边缘检测的效果不同主要体现在灵敏度和噪声敏感性上。常见的边缘检测算子包括Sobel、Prewitt、Roberts、Laplacian等。这些算子在检测边缘时会对图像中的灰度变化进行不同程度的响应,因此它们的效果也各有不同。例如,Sobel算子对噪声有一定的平滑作用,相对稳定,适合用于平滑边缘不明显的图像;而Laplacian算子对噪声比较敏感,但能够检测出更细微的边缘变化。因此,不同的算子在边缘检测时会表现出不同的灵敏度和抗噪声能力。

2.比较不同方向的检测算子对边缘检测的效果有什么不同?
不同方向的检测算子对边缘检测的效果主要体现在其对于不同方向边缘的响应上。例如,Sobel算子有水平和垂直两个方向的模板,分别用于检测水平和垂直方向的边缘;而Prewitt算子也有类似的特点。这意味着不同方向的检测算子会对图像中的水平和垂直边缘有不同程度的响应。因此,在对具有明显方向性的边缘进行检测时,选择合适的方向性检测算子是非常重要的,以获得更准确的边缘检测结果。

3.迭代法和Otsu法两种不同的阈值处理方法对图像进行分割的效果有什么不同?
迭代法和Otsu法是两种不同的阈值处理方法,它们对图像进行分割的效果也有所不同。迭代法通过反复迭代计算阈值,将图像分成两部分,直到达到某个停止条件为止。这种方法相对简单,但可能对噪声比较敏感,因此在噪声较多的图像上可能表现出不稳定性。而Otsu法则是一种基于类间方差最大化原则选择最优阈值的方法,它能够有效地将目标和背景分开,并且相对稳健,对噪声的影响较小。因此,Otsu法通常能够得到更加准确的图像分割结果,特别是在处理具有复杂灰度分布或存在噪声的图像时效果更为明显。

  • 18
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值