OTSU
在前面固定阈值中选取了一个阈值为127进行阈值分割,那如何知道选的这个阈值效果好不好呢?答案是:不断尝试,所以这种方法在很多文献中都被称为经验阈值。
Otsu阈值法就提供了一种自动高效的二值化方法。Otsu算法也称最大类间差法,有时也称之为大津算法,由大津于1979年提出,被认为是图像分割中阈值选取的最佳算法。其算法计算简单,不受图像亮度和对比度的影响,因此在数字图像处理上得到了广泛的应用。它是按图像的灰度特性,将图像分成背景和前景两部分。因方差是灰度分布均匀性的一种度量,背景和前景之间的类间方差越大,说明构成图像的两部分的差别越大,当部分前景错分为背景或部分背景错分为前景都会导致两部分差别变小。因此,使类间方差最大分割意味着错分概率最小。Otsu阈值分割方法,选择使得类间方差最大的值作为阈值,设图像的归一化直方图为p,亮度阶为k(例如元素值取0~255,则k=256)。
示例代码
作者:liutangplease
链接:https://www.zhihu.com/question/362086374/answer/2654724809
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
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);
文章来源:https://www.uudwc.com/A/k9Xbw/
效果图片
文章来源地址https://www.uudwc.com/A/k9Xbw/