大津法是由大津展之(おおつのぶゆき)发明的算法,故称大津法。
一、 数学原理
大津法又叫最大类间方差法、最大类间阈值法(OTSU)。它的基本思想是,用一个阈值将图像中的数据分为两类,一类中图像的像素点的灰度均小于这个阈值,另一类中的图像的像素点的灰度均大于或者等于该阈值。如果这两个类中像素点的灰度的方差越大,说明获取到的阈值就是最佳的阈值(方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大的分割意味着错分概率最小。)。则利用该阈值可以将图像分为前景和背景两个部分。而我们所感兴趣的部分一般为前景。
其优点是计算简单快速,不受图像亮度和对比度的影响。缺点是对图像噪声敏感;只能针对单一目标分割;当目标和背景大小比例悬殊、类间方差函数可能呈现双峰或者多峰,这个时候效果不好。
二、编程实现
程序是通过matlab实现的,通常,我们在智能车大赛的过程中也常常会用到,代码含义已注释。
filename='E:\learning\机器视觉\machinevision\saidao.jpg';
rgb = imread(filename);
gray = rgb2gray(rgb);%转换为灰度图
gray_max = max(max(gray));
gray_min = min(min(gray));
gray_list = gray_min : gray_max;%阈值范围
ISIZE = size(gray);%图像大小
pixel_all = ISIZE(1) * ISIZE(2);%总像素个数
Tmp = 0;%存放类间方差
threshold = 0;%存放阈值
for i = 1 : length(gray_list) %从MIN到MAX
gray_value = gray_list(1,i);
pixel_front = 0;%前景像素个数
pixel_back = 0;%背景像素个数
gray_front = 0;%前景总灰度
gray_back = 0;%背景总灰度
for j = 1 : ISIZE(1)
for k=1 : ISIZE(2)
pixelgray = gray(j,k);
if(pixelgray >= gray_value)
pixel_front = pixel_front+1;
gray_front = gray_front + double(pixelgray);
else
pixel_back = pixel_back+1;
gray_back = gray_back+double(pixelgray);
end
end
end
w0 = pixel_front/pixel_all;%前景点数比例
w1 = pixel_back/pixel_all;%背景点数比例
u0 = gray_front/pixel_front;%前景点数平均灰度
u1 = gray_back/pixel_back;%背景点数平均灰度
u = (gray_front+gray_back)/pixel_all;%图像总平均灰度
tmp = w0*(u0-u)*(u0-u) + w1*(u1-u)*(u1-u);
if(Tmp < tmp)
threshold = gray_value;
Tmp = tmp;
end
end
%二值化
black_and_white = gray;
for j = 1:ISIZE(1)
for k = 1:ISIZE(2)
if(black_and_white(j,k) >= threshold)
black_and_white(j,k) = 255;
else
black_and_white(j,k) = 0;
end
end
end
level = graythresh(gray);
imgbw = im2bw(gray,level);
level2=double(threshold)/255;
imgbw2 = im2bw(gray,level2);
subplot(221); imshow(gray);
subplot(222); imshow(black_and_white);
subplot(223); imshow(imgbw);
subplot(224); imshow(imgbw2);
三、处理效果
可见效果较好。
机器视觉目录: