基于Python的圖像閾值化分割(迭代法)
1.閾值化分割原理
通過(guò)對(duì)圖像的灰度直方圖進(jìn)行數(shù)學(xué)統(tǒng)計(jì),選擇一個(gè)或多個(gè)閾值將像素劃分為若干類。一般情況下,當(dāng)圖像由灰度值相差較大的目標(biāo)和背景組成時(shí),如果目標(biāo)區(qū)域內(nèi)部像素灰度分布均勻一致,背景區(qū)域像素在另一個(gè)灰度級(jí)上也分布均勻,這時(shí)圖像的灰度直方圖會(huì)呈現(xiàn)出雙峰特性。
在這種情況下,選取位于這兩個(gè)峰值中間的谷底對(duì)應(yīng)的灰度值T作為灰度閾值,將圖像中各個(gè)像素的灰度值與這個(gè)閾值進(jìn)行比較,根據(jù)比較的結(jié)果將圖像中的像素劃分到兩個(gè)類中。像素灰度值大于閾值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 Image import matplotlib.pyplot as plt import 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=0 res1=0 res2=0 s1=0 s2=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 #舊閾值儲(chǔ)存在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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用arrow庫(kù)優(yōu)雅地處理時(shí)間數(shù)據(jù)詳解
雖然Python提供了多個(gè)內(nèi)置模塊用于操作日期時(shí)間,但有的時(shí)候并不能滿足我們的需求,所以下面這篇文章主要給大家介紹了關(guān)于Python使用arrow庫(kù)如何優(yōu)雅地處理時(shí)間數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10python+JS?實(shí)現(xiàn)逆向?SMZDM?的登錄加密
這篇文章主要介紹了python+JS?實(shí)現(xiàn)逆向?SMZDM?的登錄加密,文章通過(guò)利用SMZDM平臺(tái)展開(kāi)詳細(xì)的內(nèi)容介紹,需要的小伙伴可以參考一下2022-05-05Python 圖片文字識(shí)別的實(shí)現(xiàn)之PaddleOCR
OCR方向的工程師,之前一定聽(tīng)說(shuō)過(guò)PaddleOCR這個(gè)項(xiàng)目,其主要推薦的PP-OCR算法更是被國(guó)內(nèi)外企業(yè)開(kāi)發(fā)者廣泛應(yīng)用,短短半年時(shí)間,累計(jì)Star數(shù)量已超過(guò)15k,頻頻登上Github Trending和Paperswithcode 日榜月榜第一2021-11-11對(duì)pandas處理json數(shù)據(jù)的方法詳解
今天小編就為大家分享一篇對(duì)pandas處理json數(shù)據(jù)的方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02總結(jié)python實(shí)現(xiàn)父類調(diào)用兩種方法的不同
最近在工作中實(shí)現(xiàn)父類調(diào)用的時(shí)候發(fā)現(xiàn)了一個(gè)錯(cuò)誤,然后通過(guò)分析實(shí)踐總結(jié)出來(lái)了,下面這篇文章主要給大家總結(jié)了python中實(shí)現(xiàn)父類調(diào)用兩種方法的不同之處,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-01-01python正則表達(dá)式函數(shù)match()和search()的區(qū)別
match()和search()都是python中的正則匹配函數(shù),那這兩個(gè)函數(shù)有何區(qū)別呢?本文詳細(xì)介紹了這2個(gè)函數(shù)的區(qū)別2021-10-10python中合并兩個(gè)文本文件并按照姓名首字母排序的例子
這篇文章主要介紹了python中合并兩個(gè)文本文件并按照姓名首字母排序的例子,需要的朋友可以參考下2014-04-04