這篇文章將為大家詳細(xì)講解有關(guān)怎么在Python中利用opencv對(duì)圖像閾值進(jìn)行處理,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。
(一)簡(jiǎn)單閾值
簡(jiǎn)單閾值當(dāng)然是最簡(jiǎn)單,選取一個(gè)全局閾值,然后就把整幅圖像分成了非黑即白的二值圖像了。函數(shù)為cv2.threshold()
這個(gè)函數(shù)有四個(gè)參數(shù),第一個(gè)原圖像,第二個(gè)進(jìn)行分類的閾值,第三個(gè)是高于(低于)閾值時(shí)賦予的新值,第四個(gè)是一個(gè)方法選擇參數(shù),常用的有:
cv2.THRESH_BINARY(黑白二值)
cv2.THRESH_BINARY_INV(黑白二值反轉(zhuǎn))
cv2.THRESH_TRUNC (得到的圖像為多像素值)
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV
該函數(shù)有兩個(gè)返回值,第一個(gè)retVal(得到的閾值值(在后面一個(gè)方法中會(huì)用到)),第二個(gè)就是閾值化后的圖像。
一個(gè)實(shí)例如下:
import cv2 import matplotlib.pyplot as plt img = cv2.imread('flower.jpg',0) #直接讀為灰度圖像 ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV) ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC) ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO) ret,thresh6 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV) titles = ['img','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV'] images = [img,thresh2,thresh3,thresh4,thresh5,thresh6] for i in range(6): plt.subplot(2,3,i+1),plt.imshow(images[i],'gray') plt.title(titles[i]) plt.xticks([]),plt.yticks([]) plt.show()
可以看到這里把閾值設(shè)置成了127,對(duì)于BINARY方法,當(dāng)圖像中的灰度值大于127的重置像素值為255.
(二)自適應(yīng)閾值:
前面看到簡(jiǎn)單閾值是一種全局性的閾值,只需要規(guī)定一個(gè)閾值值,整個(gè)圖像都和這個(gè)閾值比較。而自適應(yīng)閾值可以看成一種局部性的閾值,通過規(guī)定一個(gè)區(qū)域大小,比較這個(gè)點(diǎn)與區(qū)域大小里面像素點(diǎn)的平均值(或者其他特征)的大小關(guān)系確定這個(gè)像素點(diǎn)是屬于黑或者白(如果是二值情況)。使用的函數(shù)為:cv2.adaptiveThreshold()
該函數(shù)需要填6個(gè)參數(shù):
第一個(gè)原始圖像
第二個(gè)像素值上限
第三個(gè)自適應(yīng)方法Adaptive Method:
— cv2.ADAPTIVE_THRESH_MEAN_C :領(lǐng)域內(nèi)均值
—cv2.ADAPTIVE_THRESH_GAUSSIAN_C :領(lǐng)域內(nèi)像素點(diǎn)加權(quán)和,權(quán) 重為一個(gè)高斯窗口
第四個(gè)值的賦值方法:只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
第五個(gè)Block size:規(guī)定領(lǐng)域大小(一個(gè)正方形的領(lǐng)域)
第六個(gè)常數(shù)C,閾值等于均值或者加權(quán)值減去這個(gè)常數(shù)(為0相當(dāng)于閾值 就是求得領(lǐng)域內(nèi)均值或者加權(quán)值)
這種方法理論上得到的效果更好,相當(dāng)于在動(dòng)態(tài)自適應(yīng)的調(diào)整屬于自己像素點(diǎn)的閾值,而不是整幅圖像都用一個(gè)閾值。
一個(gè)實(shí)例如下:
mport cv2 import matplotlib.pyplot as plt img = cv2.imread('flower.jpg',0) #直接讀為灰度圖像 ret,th2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\ cv2.THRESH_BINARY,11,2) #換行符號(hào) \ th4 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\ cv2.THRESH_BINARY,11,2) #換行符號(hào) \ images = [img,th2,th3,th4] plt.figure() for i in xrange(4): plt.subplot(2,2,i+1),plt.imshow(images[i],'gray') plt.show()
可以看到上述窗口大小使用的為11,當(dāng)窗口越小的時(shí)候,得到的圖像越細(xì)。想想一下,如果把窗口設(shè)置足夠大以后(不能超過圖像大?。敲吹玫降慕Y(jié)果可能就和第二幅圖像的相同了。
(三)Otsu's二值化
我們前面說到,cv2.threshold函數(shù)是有兩個(gè)返回值的,前面一直用的第二個(gè)返回值,也就是閾值處理后的圖像,那么第一個(gè)返回值(得到圖像的閾值)將會(huì)在這里用到。
前面對(duì)于閾值的處理上,我們選擇的閾值都是127,那么實(shí)際情況下,怎么去選擇這個(gè)127呢?有的圖像可能閾值不是127得到的效果更好。那么這里我們需要算法自己去尋找到一個(gè)閾值,而Otsu's就可以自己找到一個(gè)認(rèn)為最好的閾值。并且Otsu's非常適合于圖像灰度直方圖具有雙峰的情況,他會(huì)在雙峰之間找到一個(gè)值作為閾值,對(duì)于非雙峰圖像,可能并不是很好用。那么經(jīng)過Otsu's得到的那個(gè)閾值就是函數(shù)cv2.threshold的第一個(gè)參數(shù)了。因?yàn)镺tsu's方法會(huì)產(chǎn)生一個(gè)閾值,那么函數(shù)cv2.threshold的的第二個(gè)參數(shù)(設(shè)置閾值)就是0了,并且在cv2.threshold的方法參數(shù)中還得加上語句cv2.THRESH_OTSU。那么什么是雙峰圖像(只能是灰度圖像才有),就是圖像的灰度統(tǒng)計(jì)圖中可以明顯看出只有兩個(gè)波峰,比如下面一個(gè)圖的灰度直方圖就可以是雙峰圖:
好了現(xiàn)在對(duì)這個(gè)圖進(jìn)行Otsu's閾值處理就非常的好,通過函數(shù)cv2.threshold會(huì)自動(dòng)找到一個(gè)介于兩波峰之間的閾值。一個(gè)實(shí)例如下:
import cv2 import matplotlib.pyplot as plt img = cv2.imread('finger.jpg',0) #直接讀為灰度圖像 #簡(jiǎn)單濾波 ret1,th2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY) #Otsu 濾波 ret2,th3 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) print ret2 plt.figure() plt.subplot(221),plt.imshow(img,'gray') plt.subplot(222),plt.hist(img.ravel(),256)#.ravel方法將矩陣轉(zhuǎn)化為一維 plt.subplot(223),plt.imshow(th2,'gray') plt.subplot(224),plt.imshow(th3,'gray')
關(guān)于怎么在Python中利用opencv對(duì)圖像閾值進(jìn)行處理就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。
網(wǎng)站欄目:怎么在Python中利用opencv對(duì)圖像閾值進(jìn)行處理-創(chuàng)新互聯(lián)
轉(zhuǎn)載注明:http://jinyejixie.com/article30/dissso.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、用戶體驗(yàn)、搜索引擎優(yōu)化、域名注冊(cè)、網(wǎng)站設(shè)計(jì)、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容