亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Python下opencv圖像閾值處理的使用筆記

系統(tǒng) 1696 0

圖像的閾值處理一般使得圖像的像素值更單一、圖像更簡(jiǎn)單。閾值可以分為全局性質(zhì)的閾值,也可以分為局部性質(zhì)的閾值,可以是單閾值的也可以是多閾值的。當(dāng)然閾值越多是越復(fù)雜的。下面將介紹opencv下的三種閾值方法。

(一)簡(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,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret,thresh2 = cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,thresh3 = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,thresh4 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,thresh5 = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
titles = ['img','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img,thresh1,thresh2,thresh3,thresh4,thresh5]
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()
          

Python下opencv圖像閾值處理的使用筆記_第1張圖片 ?

可以看到這里把閾值設(shè)置成了127,對(duì)于BINARY方法,當(dāng)圖像中的灰度值大于127的重置像素值為255.

(二)自適應(yīng)閾值:

前面看到簡(jiǎn)單閾值是一種全局性的閾值,只需要規(guī)定一個(gè)閾值值,整個(gè)圖像都和這個(gè)閾值比較。而自適應(yīng)閾值可以看成一種局部性的閾值,通過(guò)規(guī)定一個(gè)區(qū)域大小,比較這個(gè)點(diǎn)與區(qū)域大小里面像素點(diǎn)的平均值(或者其他特征)的大小關(guān)系確定這個(gè)像素點(diǎn)是屬于黑或者白(如果是二值情況)。使用的函數(shù)為:cv2.adaptiveThreshold()
該函數(shù)需要填6個(gè)參數(shù):

  1. 第一個(gè)原始圖像
  2. 第二個(gè)像素值上限
  3. 第三個(gè)自適應(yīng)方法Adaptive Method:
    1. ― cv2.ADAPTIVE_THRESH_MEAN_C :領(lǐng)域內(nèi)均值
    2. ―cv2.ADAPTIVE_THRESH_GAUSSIAN_C :領(lǐng)域內(nèi)像素點(diǎn)加權(quán)和,權(quán) 重為一個(gè)高斯窗口
  4. 第四個(gè)值的賦值方法:只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
  5. 第五個(gè)Block size:規(guī)定領(lǐng)域大小(一個(gè)正方形的領(lǐng)域)
  6. 第六個(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,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY,11,2) #換行符號(hào) \
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2) #換行符號(hào) \
images = [img,th1,th2,th3]
plt.figure()
for i in xrange(4):
 plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
plt.show()
          

Python下opencv圖像閾值處理的使用筆記_第2張圖片 ?

可以看到上述窗口大小使用的為11,當(dāng)窗口越小的時(shí)候,得到的圖像越細(xì)。想想一下,如果把窗口設(shè)置足夠大以后(不能超過(guò)圖像大?。?,那么得到的結(jié)果可能就和第二幅圖像的相同了。

(三)Otsu's二值化

我們前面說(shuō)到,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)過(guò)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ù)中還得加上語(yǔ)句cv2.THRESH_OTSU。那么什么是雙峰圖像(只能是灰度圖像才有),就是圖像的灰度統(tǒng)計(jì)圖中可以明顯看出只有兩個(gè)波峰,比如下面一個(gè)圖的灰度直方圖就可以是雙峰圖:

Python下opencv圖像閾值處理的使用筆記_第3張圖片 ?

好了現(xiàn)在對(duì)這個(gè)圖進(jìn)行Otsu's閾值處理就非常的好,通過(guò)函數(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,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
#Otsu 濾波
ret2,th2 = 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(th1,'gray')
plt.subplot(224),plt.imshow(th2,'gray')
          

Python下opencv圖像閾值處理的使用筆記_第4張圖片 ?

print ret2 得到的結(jié)果為122??梢钥闯鏊坪鮾蓚€(gè)結(jié)果并沒(méi)有很明顯差別(素材也不太好弄~_~!),主要是兩個(gè)閾值(127與122)太相近了,如果這兩個(gè)隔得很遠(yuǎn)那么會(huì)很明顯的。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!??!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 国产99久久九九精品免费 | 日韩欧美中文字幕在线播放 | 成年人视频黄色 | 日韩视频 中文字幕 视频一区 | 亚洲欧美一区二区三区在饯 | 成人午夜毛片在线看 | a一级特黄日本大片 s色 | 国产精品久久久香蕉 | 亚洲视频不卡 | 伊人伊狠亚洲综合影院 | 免费观看a黄一级视频 | 国产片91人成在线观看 | 成人亚洲欧美综合 | 九九热最新视频 | 欧美亚洲高清日韩成人 | 国产成人综合久久亚洲精品 | 日韩毛片在线免费观看 | 四虎影视在线看 | 国产亚洲欧美日韩综合另类 | 特级做人爱c级特级aav毛片 | 国产视频a| 日本一区中文字幕 | 九九re| 四虎精品| 99久久精品费精品国产一区二区 | 婷婷激情在线视频 | 国产性较精品视频免费 | 最新国产午夜精品视频成人 | 国产精品热久久 | 久久精品免视着国产成人 | 99在线观看视频免费 | 国产精品福利资源在线 | 国产普通话自拍 | 亚洲国产精品久久久天堂麻豆 | 久久久美女视频 | 久久久久久亚洲精品影院 | 国产成人在线观看免费网站 | 日韩中文字幕在线有码视频网 | 日韩成人三级 | 久久综合中文字幕 | 午夜一级毛片免费视频 |