图像阈值分割:大津法(Otsu)

2,286 阅读2分钟

大津法(OTSU法)是由大津于1979 年提出的,对图像I,记T为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。从最小灰度值到最大灰度值遍历T,当T使得方差值δ=w0*w1*(u0-u1)*(u0-u1)最大时,T即为分割的最佳阈值。

测试程序
clear; clc;
I=imread('rice.tif');
subplot(1, 3, 1)
imshow(I);
xlabel('(a) 原始图像');
level = graythresh(I); %使用MATLAB 函数计算阈值
BW = im2bw(I, level);
subplot(1, 3, 2)
imshow(BW);
xlabel('(b) graythresh');
disp(['graythresh 计算灰度阈值:', num2str(level*255)]);
T = Otsu(double(I)); %使用大津法计算阈值
disp(['大津法计算灰度阈值:', num2str(T)])
BW = im2bw(I, T/255);
%阈值分割
subplot(1, 3, 3)
imshow(BW);
xlabel('(c) 大津法');
测试结果


源码
function ThreshValue = Otsu(Imag)
% 大津法计算阈值
% 输入:
% Imag:二维数组,数值表示灰度;
% 输出:
% ThreshValue:阈值
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);

---------------------
作者:有个家伙喜欢代码
来源:CSDN
原文:blog.csdn.net/u012366767 …
版权声明:本文为博主原创文章,转载请附上博文链接!

更多学习资料可关注:annalin1203获取