基于二维最大熵原理的灰度图像阈值分割系统
项目简介
本项目是一个基于MATLAB开发的图像分割系统,采用二维最大熵(2D Maximum Entropy)算法对灰度图像进行自动阈值分割。与传统的一维阈值分割方法(仅考虑像素自身的灰度信息)不同,本系统引入了像素的空间邻域特征,通过构建"像素灰度-邻域平均灰度"的二维直方图,利用最大熵准则自动寻找最佳的二维分割阈值。该方法能够有效利用图像的空间相关性,在含有噪声的图像分割任务中表现出比一维方法更强的鲁棒性和准确性。
功能特性
- 智能图像源处理:自动尝试读取标准测试图像,若读取失败则自动生成包含双峰特征的合成图像作为替代。
- 抗噪性能测试:系统内置高斯噪声添加功能,主动对输入图像施加噪声以验证算法在非理想环境下的鲁棒性。
- 空间特征提取:计算每个像素点的3x3邻域平均灰度,构建反映空间相关性的特征层。
- 高效算法实现:利用MATLAB的向量化操作(
accumarray)和积分图(累积和表)技术,极大幅度降低了二维熵计算的时间复杂度。 - 自动阈值寻优:基于Shannon熵定义,自动搜索使目标和背景离散熵之和最大的最佳二维阈值向量 $(s, t)$。
- 多维可视化:提供原图、二维直方图(3D视图)、熵函数分布热力图以及最终分割结果的对比展示。
系统要求
- MATLAB R2016a 或更高版本
- Image Processing Toolbox(图像处理工具箱)
算法原理与实现细节
本项目核心代码实现了以下关键处理流程:
1. 图像预处理与噪声注入
系统首先对输入图像进行灰度化处理(如果是彩色图像)。为了模拟真实应用场景并展示二维方法的优势,代码明确引入了均值为0、方差为0.005的高斯噪声。随后将图像数据转换为双精度浮点型(double),以便进行后续的精确数值计算。
2. 构建二维灰度直方图
代码利用
fspecial 和
imfilter 创建一个3x3的平均滤波器,计算原图中每个像素对应的邻域平均灰度值。
+
特征定义:
+ $f(x,y)$:像素点的灰度值。
+ $g(x,y)$:像素点邻域的平均灰度值。
+
直方图统计:通过线性索引和
accumarray 函数快速统计 $(f, g)$ 对应的频数,生成 $256 times 256$ 的二维联合概率分布矩阵 $P_{ij}$。这种方法避免了大尺寸图像下的双重循环遍历,提高了执行效率。
3. 基于积分图加速的熵计算(核心优化)
算法的核心在于寻找最佳阈值向量 $(s, t)$,使得目标类和背景类的后验熵之和最大。
+
积分图技术:为了避免在每次遍历 $(s, t)$ 时重复累加计算区域概率和熵,代码预先计算了两个累积表:
+
概率累积表 (CumSum_P):快速查询任意矩形区域的概率和。
+
熵累积表 (CumSum_H):快速查询任意矩形区域的自信息量和。
+
区域划分:将二维直方图平面划分为A区(背景,坐标范围 $0 sim s, 0 sim t$)和B区(目标,坐标范围 $s+1 sim 255, t+1 sim 255$),忽略偏离对角线的噪声区域。
+
熵最大化搜索:遍历所有可能的 $s$ 和 $t$ 组合,利用积分图在 $O(1)$ 时间内计算出当前阈值下的背景熵 $H_A$ 和目标熵 $H_B$,如果不满足概率大于0的条件则忽略。记录使总熵 $Phi = H_A + H_B$ 最大的位置作为最佳阈值。
4. 二值化分割
根据计算出的最佳像素阈值 $s$ 和最佳邻域均值阈值 $t$,生成最终的二值图像。
+
分割逻辑:系统采用了严格的联合约束逻辑,即只有当某个像素的
灰度值大于 $s$ 且
邻域均值大于 $t$ 时,才将其标记为目标(白色),否则标记为背景(黑色)。这种处理方式充分利用了空间一致性,能有效去除孤立的噪声点。
5. 结果可视化
系统运行结束后会弹出一个包含四个子图的窗口:
- 输入图像:显示添加了高斯噪声后的待处理灰度图。
- 二维直方图:以3D网格形式展示像灰度与邻域均值的联合分布情况。
- 熵函数分布:通过热力图展示不同 $(s, t)$ 组合下的熵值变化,并用红色十字标记出最大熵对应的最佳阈值点。
- 分割结果:显示最终生成的二值化黑白图像。
此外,控制台会输出具体的最佳像素阈值、最佳邻域均值阈值以及对应的最大熵值。
使用方法
- 将代码保存为MATLAB脚本文件(例如
main.m)或直接在MATLAB编辑器中打开。 - 确保当前目录下有一张名为
cameraman.tif 的图片,或者直接运行,系统会自动生成合成图像。 - 直接运行该函数。
- 观察弹出的图形窗口分析分割效果,并查看命令行窗口输出的阈值数据。