基于MATLAB的图像处理技术:实验三 图像分割

实验三 图像分割

一、实验目的

掌握直方图相关理论;

掌握阈值分割概念、原理、数学基础及算法;

能够编程或调用库函数完成基于阈值方法的图像分割。

二、实验内容

完成lotus.jpeg图片中莲花的分割,下面题目三选一:

1. 基于灰度直方图方法选择阈值进行分割。

2. 基于最大类间方差方法选择阈值进行分割。

3. 针对特定图像分析用大津原始算法分割存在的问题,给出改进方法并验证(参考相关论文,并列出参考文献)。

三、相关概念、原理、数学基础及算法(对涉及的概念、原理、数学基础及算法进行详细阐述)

1.概念和原理

大津算法(Otsu's Method):大津算法,也称为最大类间方差法,是一种自适应的阈值确定方法,广泛用于基于灰度的图像分割。该算法由大津展之于1979年提出,目的是从灰度图像中自动选择一个阈值,将图像分割为前景和背景两部分。

原理:大津算法的核心原理是通过最大化类间方差(即前景和背景之间的方差)来确定最佳阈值。假设图像包含两类像素(前景和背景),算法会遍历所有可能的阈值,计算每个阈值下前景和背景的方差,选择使得类间方差最大的阈值作为最佳分割阈值。

2.数学基础

大津算法的数学基础依赖于统计学中的方差分析。给定一幅大小为M×N的图像,其灰度级范围是[0, L-1],算法的步骤如下:

(1)图像中每个灰度级的概率分布:p(i) = ni / (M * N)其中 ni 是灰度级 i 的像素数目,M 和 N 分别是图像的行数和列数。

(2)类间方差的计算公式:sigma^2(t) = omega_0(t) * omega_1(t) * (mu_0(t) - mu_1(t))^2其中:omega_0(t) 是阈值 t 下背景的概率。omega_1(t) 是阈值 t 下前景的概率。mu_0(t) 是背景的平均灰度值。mu_1(t) 是前景的平均灰度值。

(3)累计概率 P1(i) 和累计均值 M1(i) 的计算:累计概率:P1(i) = sum(j=0 to i) p(j)累计均值:M1(i) = sum(j=0 to i) j * p(j)

(4)整幅图像的总均值 MG:MG = sum(i=0 to L-1) i * p(i)其中 L 是图像的灰度级总数。

(5)最大类间方差对应的阈值 t 是使得 sigma^2(t) 最大化的值:t* = argmax(t) sigma^2(t)

3.算法

大津算法的具体步骤如下:

(1). 计算图像的直方图和归一化直方图(概率分布)。

(2). 对于每个灰度级i,计算累计概率P1(i)和累计均值M1(i)。

(3). 计算整幅图像的总均值MG。

(4). 计算类间方差sigma^2(t)

(5). 找到最大类间方差对应的阈值。

4.存在的问题

尽管大津算法在许多情况下效果良好,但它也有一些局限性:

(1). 对噪声敏感:由于大津算法依赖于直方图,图像中的噪声会影响直方图的形状,从而影响阈值的选择。

(2). 不适用于多模态图像:对于具有多个峰值的直方图,大津算法可能无法找到一个合适的阈值来分割所有对象。

(3). 对比度低的图像:如果前景和背景的对比度不明显,大津算法可能无法准确分割。

5.改进方法

为了克服大津算法的局限性,可以采取以下改进方法:

(1). 多阈值大津算法:对于多模态图像,可以通过计算多个阈值将图像分割成多个区域。

(2). 图像预处理:通过滤波(如中值滤波、高斯滤波)减少噪声的影响。

(3). 结合其他算法:如先使用边缘检测算法识别边缘,再用大津算法进行分割。

(4). 自适应方法:根据图像的局部特征自适应地调整阈值。

对于本次实验,我们采用的是多阈值大津算法来对莲花图像进行图像分割。

四、代码(自己编写代码,对核心代码进行详细注释;调用库函数,详细分析参数及返回值)

% 读取图像
bwImage = imread('lotus.jpg');
 
% 将图像转换为灰度图像
bwImage = rgb2gray(bwImage);
 
% 使用MATLAB内置的graythresh函数找到阈值
level = graythresh(bwImage);
 
% 使用大津算法得到的阈值来转换图像为二值图像
bwOtsu = imbinarize(bwImage, level);
 
% 使用多阈值大津算法计算两个阈值
numThresholds = 2; % 可以根据需要选择更多的阈值
thresholds = multithresh(bwImage, numThresholds);
 
% 应用阈值进行图像分割
seg_I = imquantize(bwImage, thresholds);
 
% 显示分割结果
figure;
subplot(1,3,1), imshow(bwImage), title('原始图像');
subplot(1,3,2), imshow(bwOtsu), title('大津原算法');
subplot(1,3,3), imshow(seg_I,[]), title('改进后的大津算法');

下面是对代码的详细解释:

% 读取图像

bwImage = imread('lotus.jpg');

imread`函数用于读取图像文件,这里读取的是名为 'lotus.jpg' 的文件。返回值bwImag是一个数组,包含了图像的像素数据。

% 将图像转换为灰度图像

bwImage = rgb2gray(bwImage);

rgb2gray函数将彩色图像转换为灰度图像。如果输入的 bwImage是三维数组,rgb2gray会将其转换为二维数组,每个像素的灰度值是原来RGB值的加权和。

% 使用MATLAB内置的graythresh函数找到阈值

level = graythresh(bwImage);

graythresh函数实现了大津算法,用于计算灰度图像的全局阈值。bwImage是输入的灰度图像,level是返回的阈值,范围在 0 到 1 之间,它是根据图像的直方图计算出来的,用于最大化类间方差。

% 使用大津算法得到的阈值来转换图像为二值图像

bwOtsu = imbinarize(bwImage, level);

imbinarize函数将灰度图像转换为二值图像,使用 level作为阈值。大于或等于阈值的像素被设置为 1(白色),小于阈值的像素被设置为 0(黑色)。bwOtsu是二值化后的图像。

% 使用多阈值大津算法计算两个阈值

numThresholds = 2; % 可以根据需要选择更多的阈值

thresholds = multithresh(bwImage, numThresholds);

multithresh函数是 graythresh的扩展,用于计算多个阈值。numThresholds指定了要计算的阈值数量,在这里是 2。thresholds是一个数组,包含了计算出来的阈值。

% 应用阈值进行图像分割

seg_I = imquantize(bwImage, thresholds);

imquantize函数使用thresholds中的阈值对图像进行量化,即根据阈值将图像分割成几个区域。seg_I是分割后的图像,其中的每个像素值对应于其所在区域的编号。

% 显示分割结果

figure;

subplot(1,3,1), imshow(bwImage), title('原始图像');

subplot(1,3,2), imshow(bwOtsu), title('大津算法');

subplot(1,3,3), imshow(seg_I,[]), title('改进后的大津算法');

这一部分代码创建了一个新的图形窗口,并在其中显示了三个子图。subplot函数用于在图形窗口中创建小图,imshow函数用于显示图像,title函数用于给图像添加标题。这里分别显示了原始灰度图像、使用大津算法二值化后的图像和使用多阈值大津算法分割后的图像。

五、实验结果与分析(结果截图并对结果进行详细分析)

在MATLAB中运行上述代码后,我们将得到一个包含三个子图的图形窗口,分别展示了原始图像、使用大津算法二值化后的图像,以及使用多阈值大津算法分割后的图像。以下是对这三幅图像可能出现的运行结果的详细分析:

1.原始图像:这是通过imread函数读取并通过rgb2gray函数转换为灰度图像的结果。在这幅图像中,我们可以看到图像的灰度级别,其中较亮的区域代表高灰度值,较暗的区域代表低灰度值。原始图像保留了所有的细节和灰度信息,没有进行任何形式的阈值化处理。

2. 大津算法:graythresh函数根据大津算法计算得到一个全局阈值level,然后imbinarize函数使用这个阈值将图像转换为二值图像bwOtsu。在二值化的图像中,所有高于阈值level的像素会变成白色,所有低于阈值的像素会变成黑色。这种处理方式很适合于图像中有高对比度和清晰的前景与背景区分时。我们选取的莲花图像进行图像处理正好具有高对比度和清晰度。

3.改进后的大津算法:使用multithresh函数计算了两个阈值,然后imquantize函数根据这些阈值将图像分割成三个区域。分割后的图像seg_I中的每个像素值不再是简单的黑白二值,而是根据所在的区域有不同的灰度级别。通常,这些灰度级别对应于thresholds数组中的阈值以及这些阈值之间的区间。这种方法比单阈值的大津算法更灵活,可以更好地处理灰度直方图是多峰的情况,或者当图像中存在多个不同的对象时。

在实际应用中,选择哪种方法取决于具体的图像特性和分割任务的要求。单阈值大津算法简单快速,适用于图像对比度高、前后景差异明显的情况。而多阈值大津算法更适合于复杂图像的分割,可以更细致地划分图像中的不同区域。在显示结果时,imshow(seg_I,[])中的`[]`参数是用来自动调整显示的灰度范围,以便于更好地观察分割效果。

六、问题与解决方法、总结。

下面基于本次的多阈值大津算法来做个总结。多阈值大津算法是一种基于大津算法(Otsu's method)的扩展,旨在对图像进行多个阈值的分割。该算法是图像处理中常用的阈值分割技术之一,其特点和适用场景如下:

1.算法特点:多阈值分割:与传统的单阈值大津算法不同,多阈值大津算法能够同时确定多个阈值来将图像分割为多个不同的区域。局部性能更优:通过采用多个阈值,能够更精细地分割图像,提高图像分割的准确性和局部性能。自适应性强:能够根据图像的不同特性和背景进行自适应阈值选择,适用于多样化的图像场景。

2.适用场景:复杂背景分割:对于背景复杂、包含多个不同目标的图像,多阈值大津算法能够更好地分离不同目标,提高图像分割的精度。在医学图像分析中,多阈值大津算法可以用于识别和分割多个组织类型或病变区域,有助于医学诊断和分析。适用于自然场景图像的分割,例如地物分类、植被分析和地理信息系统(GIS)中的图像处理等领域。

3.应用优势:提高分割准确性:相比于单阈值方法,多阈值大津算法能够更精细地划分图像区域,提高分割的准确性和细节表达能力。灵活性和可调节性:算法允许调整阈值数量,根据具体需求对图像进行更灵活的分割处理。广泛适用性:由于其自适应性和多阈值的特点,多阈值大津算法在不同领域的图像处理任务中都有广泛的应用前景。

总体来说,多阈值大津算法在图像分割中展现出了较高的灵活性和精度,在处理复杂场景和多目标图像时能够更好地满足需求。当然,在实际应用中,算法的性能也会受到图像噪声、光照变化等因素的影响,需要结合具体情况进行调整和优化,以达到更好的分割效果。


七、相关参考文献: 

陈星池, 韩超, 刘静. 基于模糊熵的大津多阈值图像分割算法[J]. 计算机工程与应用, 2015, 51(17): 170-173.

胡波, 贾振元, 张美娜, 等. 一种快速双阈值大津图像分割新算法[J]. 光电工程, 2007, 34(01): 114-118.

蒋树强, 张辉.改进的多阈值图像分割大津算法研究[J]. 计算机工程与设计 30.9 (2009): 2180-2182.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值