利用ostu方法(大津法)求图像二值分割的全局最优阈值,显示分割后的效果,并与迭代法进行比较。
- 测试程序
clc
clear
f = imread('Fig1013(a)(scanned-text-grayscale).tif');
figure,subplot(2,2,1), imshow(f)
title('原始图像')
subplot(2,2,2), imhist(f)
T = 0.5*(double(min(f(:))) + double(max(f(:))));
done = false;
while ~done
g = f>=T;
Tnext = 0.5*(mean(f(g)) + mean(f(~g)));
done = abs(T - Tnext) < 0.5;
T = Tnext;
end
g = f<=T;
subplot(2,2,3), imshow(g)
title('使用迭代方法得到的阈值处理后的图像')
T2 = Otsu(f);
g=imbinarize(f,T/255);
subplot(2,2,4), imshow(g);
title('使用大津法计算阈值处理后的图像');
- Otsu.m
function ThreshValue = Otsu(Imag)
iMax = max(Imag(:)); % 最大值
iMin = min(Imag(:)); % 最小值
T = iMin:iMax; % 灰度值范围
Tval = zeros(size(T)); % 方差
[iRow, iCol] = size(Imag); % 数据维度大小
imagSize = iRow*iCol; % 像素点数量
% 遍历灰度值,计算方差
for i = 1 : length(T)
TK = T(i);
iFg = 0; % 前景
iBg = 0; % 背景
FgSum = 0; % 前景总数
BgSum = 0; % 背景总数
for j = 1 : iRow
for k = 1 : iCol
temp = Imag(j, k);
if temp > TK
iFg = iFg + 1; % 前景像素点统计
FgSum = FgSum + temp;
else
iBg = iBg + 1; % 背景像素点统计
BgSum = BgSum + temp;
end
end
end
w0 = iFg/imagSize; % 前景比例
w1 = iBg/imagSize; % 背景比例
u0 = FgSum/iFg; % 前景灰度平均值
u1 = BgSum/iBg; % 背景灰度平均值
Tval(i) = w0*w1*(u0 - u1)*(u0 - u1); % 计算方差
end
[~, flag] = max(Tval); % 最大值下标
ThreshValue = T(flag);
- 结果截图
部分代码引用于: Otsu.m.