图像底层Otsu二值化分割算法实现
该项目实现了经典的大津法(Otsu's Method)图像自动阈值分割算法。实现过程完全脱离MATLAB图像处理工具箱的内置函数(如graythresh、im2bw等),从最底层的数学原理出发,手动完成直方图统计、概率分布计算、类间方差优化以及二值化处理。
项目介绍
本项目的核心目标是演示和验证大津法的数学有效性。程序通过模拟一个具有明显双峰特性的非均匀灰度图像,通过迭代搜索能够使背景与前景类间方差达到最大值的灰度级,从而确定最佳分割阈值。这种方法在光照均匀的图像分割任务中具有极强的鲁棒性和自适应性。
功能特性
- 合成数据生成:内置了一个基于meshgrid生成的双峰分布测试图像。该图像包含中心高亮圆(灰度值180)与深色背景(灰度值80),并叠加了高斯随机噪声,用于模拟真实世界的复杂成像环境。
- 底层图像预处理:实现了手动RGB转灰度功能。采用加权平均法公式(0.299R + 0.587G + 0.114B)处理彩色输入。
- 自定义直方图引擎:不使用内置hist函数,通过双层循环遍历图像像素,手动统计0-255各级灰度的频数及归一化概率密度。
- 类间方差优化搜索:通过单次遍历(1至256灰度级),动态计算背景与前景的累计权重及均值,寻找使类间方差公式取得极大值的最优T点。
- 全自动化可视化:程序自动生成包含原始灰度图、带阈值标注的直方图、类间方差变化曲线以及最终分割结果的四合一综合图表。
算法实现逻辑
程序的执行严格遵循以下数学步骤:
第一步:数据准备。
利用坐标矩阵生成一个圆形前景,并将其与背景合并。之后通过加入randn函数产生的噪声,使图像灰度分布呈现出两个明显的波峰。
第二步:直方图统计。
创建一个长度为256的向量。遍历图像每一个坐标,根据像素值在向量对应位置累加计数。计算完成后,将每个灰度级的频数除以图像总像素数,得到概率质量函数(PMF)。
第三步:参数迭代。
计算图像的全局平均灰度。随后开启一级循环,从灰度1遍历到256:
- 累加计算当前阈值下的背景权重 w0。
- 通过 w1 = 1 - w0 得到前景权重。
- 更新背景部分的累积均值分量。
- 根据权重的乘积与均值差的平方计算类间方差。
第四步:阈值判定。
动态对比当前方差与历史最大方差。若当前值更大,则记录当前灰度级为最佳阈值(Best Threshold)。
第五步:像素重组。
再进行一次图像遍历。若像素点灰度值大于或等于最佳阈值,则赋值为1(白色),否则赋值为0(黑色),生成新的二值矩阵。
关键算法分析
大津法的核心在于类间方差(Inter-class Variance)的最大化。代码中实现的数学表达式为:sigma^2 = w0 * w1 * (mu0 - mu1)^2。
其中:
- w0 和 w1 分别是背景和前景像素占总像素的比例。
- mu0 和 mu1 分别是背景和前景的平均灰度值。
代码采用了高效的计算方式:在循环中通过累加概率分布来实时更新mu0,而mu1则利用全局均值和已知的部分均值通过推导得出,有效避免了在每一级阈值下重新进行全量统计,极大地提高了算法的计算效率。
使用方法
- 环境配置:确保计算机已安装MATLAB R2016b或更高版本。
- 运行脚本:在MATLAB命令行窗口运行主程序脚本。
- 外部图像测试:如果需要处理您自己的图片,请编辑脚本的第14行,取消注释并将 imread 函数中的路径修改为您的图像文件的绝对路径(例如:'C:UsersAdminPicturesmy_image.jpg')。
- 结果查看:程序运行结束后,会自动弹出图形窗口展示处理全过程,并在控制台输出最终计算得到的阈值和方差数值。
系统要求
- 操作系统:Windows, macOS 或 Linux。
- 软件平台:MATLAB(建议2016b及以上版本)。
- 硬件要求:标准CPU即可,本算法经过优化,计算时间复杂度为O(L+N),其中L为灰度级数(256),N为像素总数。