基于Python的圖像閾值化分割(迭代法)
1.閾值化分割原理
通過對圖像的灰度直方圖進(jìn)行數(shù)學(xué)統(tǒng)計(jì),選擇一個或多個閾值將像素劃分為若干類。一般情況下,當(dāng)圖像由灰度值相差較大的目標(biāo)和背景組成時,如果目標(biāo)區(qū)域內(nèi)部像素灰度分布均勻一致,背景區(qū)域像素在另一個灰度級上也分布均勻,這時圖像的灰度直方圖會呈現(xiàn)出雙峰特性。
在這種情況下,選取位于這兩個峰值中間的谷底對應(yīng)的灰度值T作為灰度閾值,將圖像中各個像素的灰度值與這個閾值進(jìn)行比較,根據(jù)比較的結(jié)果將圖像中的像素劃分到兩個類中。像素灰度值大于閾值T的像素點(diǎn)歸為一類,其余像素點(diǎn)歸為另一類。經(jīng)閾值化處理后的圖像g(x,y)定義為:
其中f(x,y)為原圖像,T為灰度閾值,g(x,y)為分割后產(chǎn)生的二值圖像。
2.算法流程圖
3.代碼實(shí)現(xiàn)
from PIL import Imageimport matplotlib.pyplot as pltimport numpy as np#讀入圖片并轉(zhuǎn)化為矩陣img = plt.imread(’2.jpg’)im = np.array(img)# 矩陣大小l = len(im)w = len(im[0])#求初始閾值zmin = np.min(im)zmax = np.max(im)t0 = int((zmin+zmax)/2)#初始化相關(guān)變量初始化t1=0res1=0res2=0s1=0s2=0#迭代法計(jì)算最佳閾值while abs(t0-t1)>0: for i in range(0,l-1): for j in range(0,w-1): if im[i,j]<t0: res1=res1+im[i,j] s1=s1+1 elif im[i,j]>t0: res2=res2+im[i,j] s2=s2+1 avg1=res1/s1 avg2=res2/s2 res1 = 0 res2 = 0 s1 = 0 s2 = 0 t1 = t0 #舊閾值儲存在t1中 t0=int((avg1+avg2)/2) #計(jì)算新閾值#閾值化分割#像素點(diǎn)灰度值小于最佳閾值t0用0填充,其余用255填充im = np.where(im[...,:] < t0, 0, 255)#繪制原圖窗口plt.figure()plt.imshow(img , cmap=’gray’)plt.title(’original’)#繪制原圖直方圖并顯示最佳閾值plt.figure()plt.hist(img.ravel(),256)plt.title(’hist’)plt.axvline(t0) #繪制最佳閾值分割線plt.text(25, 6100, 'Best Threshold:{}'.format(t0), size = 15, alpha = 0.8)#繪制閾值化分割后圖像plt.figure()plt.imshow(Image.fromarray(im) , cmap=’gray’)plt.title(’new’)#繪制閾值化分割后圖像的直方圖plt.figure()plt.hist(im.ravel(),256)plt.title(’hist’)plt.show()
4.閾值化分割結(jié)果
原始圖像
原始圖像直方圖
閾值化分割后圖像
閾值化分割后圖像直方圖
到此這篇關(guān)于基于Python的圖像閾值化分割(迭代法)的文章就介紹到這了,更多相關(guān)Python 圖像閾值化分割內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!
相關(guān)文章:
1. 將properties文件的配置設(shè)置為整個Web應(yīng)用的全局變量實(shí)現(xiàn)方法2. html小技巧之td,div標(biāo)簽里內(nèi)容不換行3. nestjs實(shí)現(xiàn)圖形校驗(yàn)和單點(diǎn)登錄的示例代碼4. 以PHP代碼為實(shí)例詳解RabbitMQ消息隊(duì)列中間件的6種模式5. python實(shí)現(xiàn)自動化辦公郵件合并功能6. python開發(fā)飛機(jī)大戰(zhàn)游戲7. laravel ajax curd 搜索登錄判斷功能的實(shí)現(xiàn)8. css進(jìn)階學(xué)習(xí) 選擇符9. Echarts通過dataset數(shù)據(jù)集實(shí)現(xiàn)創(chuàng)建單軸散點(diǎn)圖10. Python 如何將integer轉(zhuǎn)化為羅馬數(shù)(3999以內(nèi))
