您的位置:首页 > 编程语言 > MATLAB

Otsu最大类间方差法图像二值化MATLAB实现

2017-05-07 11:03 169 查看
OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法,可根据算法提取平坦地区的建筑物。

参考文献地址

该方法将图像分为前景和背景两部分,背景和目标之间的类间方差越大,说明构成图像的两部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。

最大类间方差法(otsu)的公式推导:

记t为前景与背景的分割阈值,前景点数占图像比例为w0,平均灰度为u0;背景点数占图像比例为w1,平均灰度为u1。

则图像的总平均灰度为:u=w0*u0+w1*u1。

前景和背景图象的方差:g=w0*(u0-u)(u0-u)+w1(u1-u)(u1-u)=w0*w1(u0-u1)*(u0-u1),此公式为方差公式。

当方差g最大时,可以认为此时前景和背景差异最大,此时的灰度t是最佳阈值

sb = w0*w1*(u1-u0)*(u0-u1)

MATLAB实现:

function [b,Out_image, th] = f_Otsu(a)
[m,n] = size(a);
N = m*n;
L = 256;
count = zeros(1, 256);   %计数
f = zeros(1, 256);   %概率
for i = 1:L
count(i) = length(find(a==(i-1)));
f(i) = count(i) / N;
end

for i=1:L
if count(i)~=0
st=i;   %起始点
break;
end
end
for i=L:-1:1
if count(i)~=0
nd=i;     %结束点
break;
end
end
p=st;   q=nd-st;
u=0;
ua = zeros(1, q + 1);
w = zeros(1, q + 1);
for i = 0 : q
u = u + f(p + i) * (p + i);   %像素的平均值
ua(i + 1) = u;            %前i个像素的平均灰度值
end;

for i = 0 : q
w(i + 1) = sum(f(p : p + i));  %前i个像素的累加概率
end;

w = w + 0.0001;

d = (u * w - ua) .^ 2 ./ (w .* (1 - w));
[y, tp]=max(d);     %取出数组的最大值及取最大值的点
th = tp + p - 1;
b = zeros(m,n);
Out_image = double(a);
for i=1:m
for j=1:n
if a(i,j) > th
b(i,j)=1;
Out_image(i,j) = nan;
else
b(i,j)=0;
end
end
end
end


调用:(注意图像为uint8格式)

image_DSM = uint8(image_DSM);
[Otsu_cell,Out_image,th] = f_Otsu(image_DSM);


输出参数:

Otsu_cell 标记分类的点,存储0 1逻辑值

Out_image 滤掉目标点(较高的一类)后的图像

th 分类的参考像素值

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息