自适应阈值分割-OTSU

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);

效果图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会的东西有点杂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值