1、图像分割 —— Otsu 全局阈值分割
1) 实现原理与流程
具体实现步骤如下:
- 统计图像各个灰度级所包含的像素个数,即归一化直方图;
- 遍历每一个可能的灰度级,根据1) 中得到的直方图,计算出对应的累计概率以及累计灰度均值;
- 直接对图像调用 mean() 函数计算出全局灰度均值;再根据累计概率、累计灰度均值以及全局灰度均值计算出类间方差;
- 结合 max() 函数和 find() 函数找出最大类间方差所对应的各个灰度值,如果有多个灰度值,则取这些灰度值的平均值作为分隔阈值;
- 通过公式计算出可分性度量,将大于等于分隔阈值的灰度值置为255(白色),小于分隔阈值的灰度值置为0(黑色)。
相关计算公式如下:
2) 函数接口实现
function binaryImage = myOtsu(rawImage)
% rawImage:处理前的单通道灰度图像
% binaryImage:处理后的二值图像(前景白色,背景黑色)
% 获取输入参数
L = 255;
img_double = double(rawImage);
% 1.计算输入图像的归一化直方图
H = myHistogramEqualization(rawImage);
% 2.计算被分类到C1类的累计概率p,累计灰度均值m
p = zeros(L+1,1);
m = zeros(L+1,1);
grey = 0 : L; % 定义一个0-L的等距数组用于表示各个可能的灰度级
for i = 0 : L
p(i+1) = sum( H(1:i+1) ); % H(i+1) --> p(i)
temp = 0 : i;
m(i+1) = sum( temp(:) .* H(