matlab 二值化_撸了一份 ostu二值化,需要的小伙伴请拿走
生活随笔
收集整理的這篇文章主要介紹了
matlab 二值化_撸了一份 ostu二值化,需要的小伙伴请拿走
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大津法二值化
小發言
本份代碼完全自寫,由于要輸入輸出圖片,故采用的是matlab語言,但是除了使用imread()和imshow()函數之外,所有代碼全部是自己寫的,并且與matlab自帶庫函數做了對比。這樣的話,也方便了大家用C移植,如果搞懂原理的話,移植也就是20分鐘的事。
上來就整原理
:閾值:小于閾值的像素,也就是前景:大于閾值的像素,也就是背景:圖像高 :圖像寬:前景像素占總數比:背景像素占總數比:前景平均灰度:背景平均灰度:整幅圖像平均灰度:類間方差化簡
當類間方差最大時。此時的灰度值就是我們需要求得最佳閾值。因此只需要對每個灰度值依次遍歷,并計算g值,加以比較從而求出最適閾值。
干貨從這里開始
首先讀取圖片
y_img=imread("pic.jpg"); imshow(y_img);然后轉換為灰度
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:hfor j=1:wHistogram(h_img(i,j)+1)=Histogram(h_img(i,j)+1)+1;end end createfigure(Histogram);%自定義繪制直方圖函數求總的灰度值
graySum=0; for i=1:256graySum = graySum + Histogram(i)*(i-1); end計算最佳閾值
n0=0; n0sum=0; temp=0; for i=1:256n0 =n0+ Histogram(i); %閾值為i時前景個數n1 = N - n0; %閾值為i時背景個數w0 = n0/N; %前景像素占總數比w1 = n1/N;%背景像素占總數比if n0==0continueendif n1==0breakend%前景平均灰度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:hfor j=1:wif h_img(i,j)>Tbw(i,j)=255;elsebw(i,j)=0;endend end imshow(bw)matlab自帶二值化
t1=graythresh(h_img); F=imbinarize(h_img,t1); imshow(F)總結
把自己寫的二值化與matlab自帶的比較,可見兩者幾乎完全一樣,可見效果還是很好的。對于二值化,方法還有好幾種,我這里只是選了一種應用最廣的大津法進行了介紹,至于對于特定的場合,不同的二值化有著不同的效果,因此,至于怎樣用,還是靠各位小伙伴深入探究了。后續可能會對各種二值化方法一一介紹哦,還是那句話,要么就不寫,絕不寫水文。想要獲取完整代碼的小伙伴,請在文末留言。
歡迎關注本人公眾號
總結
以上是生活随笔為你收集整理的matlab 二值化_撸了一份 ostu二值化,需要的小伙伴请拿走的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑与ps4共用音箱方案ps4怎么接电脑
- 下一篇: 如何在树莓派上进行python编程_《树