matlab 二值化_撸了一份 ostu二值化,需要的小伙伴请拿走

32186f7e8eb92a75bed8a13b4ef3e348.png

大津法二值化

小发言

本份代码完全自写,由于要输入输出图片,故采用的是matlab语言,但是除了使用imread()和imshow()函数之外,所有代码全部是自己写的,并且与matlab自带库函数做了对比。这样的话,也方便了大家用C移植,如果搞懂原理的话,移植也就是20分钟的事。

上来就整原理

:阈值

:小于阈值的像素,也就是前景

:大于阈值的像素,也就是背景

:图像高
:图像宽

:前景像素占总数比

:背景像素占总数比

:前景平均灰度

:背景平均灰度

:整幅图像平均灰度

:类间方差

化简

当类间方差最大时。此时的灰度值就是我们需要求得最佳阈值。因此只需要对每个灰度值依次遍历,并计算g值,加以比较从而求出最适阈值。

干货从这里开始

首先读取图片

y_img=imread("pic.jpg");
imshow(y_img);

d6bd95aa1cc0a4ccd3cdb4bc8e0246a6.png

然后转换为灰度

h_img:灰度图像

h_img=rgb2gray(y_img);
imshow(h_img);

绘制灰度直方图

[h,w]=size(h_img);
N=h*w;

直方图统计并绘出直方图

对于这里的h_img(i,j)+1 做个特别说明,是由于在matlab 里面,数组的索引是从1开始的,没有0,而对于灰度值(0到255)来说,是有0的,因此用Histogram(1)表示灰度值为0的像素点个数,同样,用Histogram(256)表示灰度值为255的像素点个数。

Histogram=zeros(1,256);
for i=1:h
    for j=1:w
        Histogram(h_img(i,j)+1)=Histogram(h_img(i,j)+1)+1;
    end
end
createfigure(Histogram);%自定义绘制直方图函数

1476b19bded4e9263b01dea221531516.png

求总的灰度值

graySum=0;
for i=1:256
    graySum = graySum + Histogram(i)*(i-1);
end

计算最佳阈值

n0=0;
n0sum=0;
temp=0;
for i=1:256
    n0 =n0+ Histogram(i);  %阈值为i时前景个数
    n1 = N - n0;      %阈值为i时背景个数
    w0 = n0/N; %前景像素占总数比
    w1 = n1/N;%背景像素占总数比
    if n0==0
        continue
    end
    if n1==0
        break
    end
    %前景平均灰度
    n0sum = n0sum+Histogram(i)*(i-1);
    u0 = n0sum/n0;
    %背景平均灰度
    n1sum = graySum-n0sum;
    u1 = n1sum/n1;
    g = w0*w1*(u0-u1)*(u0-u1);
    if g > temp  
         temp = g;
         T = i-1;   
    end
end

比较,进行二值化

bw=zeros(h,w);
for i=1:h
    for j=1:w
        if h_img(i,j)>T
            bw(i,j)=255;
        else
            bw(i,j)=0;
        end
    end
end
imshow(bw)

3691229735b1be44b6a3169baf5007bf.png

matlab自带二值化

t1=graythresh(h_img);
F=imbinarize(h_img,t1);
imshow(F)

3691229735b1be44b6a3169baf5007bf.png

总结

把自己写的二值化与matlab自带的比较,可见两者几乎完全一样,可见效果还是很好的。对于二值化,方法还有好几种,我这里只是选了一种应用最广的大津法进行了介绍,至于对于特定的场合,不同的二值化有着不同的效果,因此,至于怎样用,还是靠各位小伙伴深入探究了。后续可能会对各种二值化方法一一介绍哦,还是那句话,要么就不写,绝不写水文。想要获取完整代码的小伙伴,请在文末留言。

欢迎关注本人公众号

eef92b86869a56dac3e662d791b5caa8.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值