最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2019年08月04日 09:45:58   作者:on2way  
這篇文章主要介紹了Python下opencv圖像閾值處理的使用筆記,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

(一)簡單閾值

簡單閾值當(dāng)然是最簡單,選取一個全局閾值,然后就把整幅圖像分成了非黑即白的二值圖像了。函數(shù)為cv2.threshold()
這個函數(shù)有四個參數(shù),第一個原圖像,第二個進(jìn)行分類的閾值,第三個是高于(低于)閾值時賦予的新值,第四個是一個方法選擇參數(shù),常用的有:

  • cv2.THRESH_BINARY(黑白二值)
  • cv2.THRESH_BINARY_INV(黑白二值反轉(zhuǎn))
  • cv2.THRESH_TRUNC (得到的圖像為多像素值)
  • cv2.THRESH_TOZERO
  • cv2.THRESH_TOZERO_INV

該函數(shù)有兩個返回值,第一個retVal(得到的閾值值(在后面一個方法中會用到)),第二個就是閾值化后的圖像。
一個實(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()

這里寫圖片描述 

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

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

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

  1. 第一個原始圖像
  2. 第二個像素值上限
  3. 第三個自適應(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) 重為一個高斯窗口
  4. 第四個值的賦值方法:只有cv2.THRESH_BINARY 和cv2.THRESH_BINARY_INV
  5. 第五個Block size:規(guī)定領(lǐng)域大?。ㄒ粋€正方形的領(lǐng)域)
  6. 第六個常數(shù)C,閾值等于均值或者加權(quán)值減去這個常數(shù)(為0相當(dāng)于閾值 就是求得領(lǐng)域內(nèi)均值或者加權(quán)值)

這種方法理論上得到的效果更好,相當(dāng)于在動態(tài)自適應(yīng)的調(diào)整屬于自己像素點(diǎn)的閾值,而不是整幅圖像都用一個閾值。

一個實(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) #換行符號 \
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2) #換行符號 \
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()

這里寫圖片描述 

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

(三)Otsu's二值化

我們前面說到,cv2.threshold函數(shù)是有兩個返回值的,前面一直用的第二個返回值,也就是閾值處理后的圖像,那么第一個返回值(得到圖像的閾值)將會在這里用到。

前面對于閾值的處理上,我們選擇的閾值都是127,那么實(shí)際情況下,怎么去選擇這個127呢?有的圖像可能閾值不是127得到的效果更好。那么這里我們需要算法自己去尋找到一個閾值,而Otsu's就可以自己找到一個認(rèn)為最好的閾值。并且Otsu's非常適合于圖像灰度直方圖具有雙峰的情況,他會在雙峰之間找到一個值作為閾值,對于非雙峰圖像,可能并不是很好用。那么經(jīng)過Otsu's得到的那個閾值就是函數(shù)cv2.threshold的第一個參數(shù)了。因?yàn)镺tsu's方法會產(chǎn)生一個閾值,那么函數(shù)cv2.threshold的的第二個參數(shù)(設(shè)置閾值)就是0了,并且在cv2.threshold的方法參數(shù)中還得加上語句cv2.THRESH_OTSU。那么什么是雙峰圖像(只能是灰度圖像才有),就是圖像的灰度統(tǒng)計(jì)圖中可以明顯看出只有兩個波峰,比如下面一個圖的灰度直方圖就可以是雙峰圖:

這里寫圖片描述 

好了現(xiàn)在對這個圖進(jìn)行Otsu's閾值處理就非常的好,通過函數(shù)cv2.threshold會自動找到一個介于兩波峰之間的閾值。一個實(shí)例如下:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread('finger.jpg',0) #直接讀為灰度圖像
#簡單濾波
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')

這里寫圖片描述 

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

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

相關(guān)文章

  • python encode和decode的妙用

    python encode和decode的妙用

    做網(wǎng)絡(luò)編程的時候,經(jīng)常需要把接收到的數(shù)據(jù)用16進(jìn)制的方式打印出來,方便查看。今天發(fā)現(xiàn)在Python下有這樣一個簡單的方法。
    2009-09-09
  • python爬蟲 urllib模塊發(fā)起post請求過程解析

    python爬蟲 urllib模塊發(fā)起post請求過程解析

    這篇文章主要介紹了python爬蟲 urllib模塊發(fā)起post請求過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • python中遍歷文件的3個方法

    python中遍歷文件的3個方法

    這篇文章主要介紹了python中遍歷文件的3個方法,本文分別使用os.path.walk()、os.walk()、os.listdir()來實(shí)現(xiàn),需要的朋友可以參考下
    2014-09-09
  • 九步學(xué)會Python裝飾器

    九步學(xué)會Python裝飾器

    這篇文章主要介紹了Python裝飾器的用法,以實(shí)例形式較為詳細(xì)的介紹了Python裝飾器的使用方法,需要的朋友可以參考下
    2015-05-05
  • Python中enumerate()函數(shù)詳細(xì)分析(附多個Demo)

    Python中enumerate()函數(shù)詳細(xì)分析(附多個Demo)

    Python的enumerate()函數(shù)是一個內(nèi)置函數(shù),主要用于在遍歷循環(huán)中獲取每個元素的索引以及對應(yīng)的值,這篇文章主要介紹了Python中enumerate()函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2024-10-10
  • Python如何將圖像音視頻等資源文件隱藏在代碼中(小技巧)

    Python如何將圖像音視頻等資源文件隱藏在代碼中(小技巧)

    有朋友問小編使用pyinstaller打包源碼時,因?yàn)榇a中使用了圖像、音頻、視頻等資源文件,無法將程序打包成單一的可執(zhí)行文件,怎么處理呢,下面小編通過代碼給大家介紹Python如何將圖像音視頻等資源文件隱藏在代碼中,感興趣的朋友一起看看吧
    2020-02-02
  • 從運(yùn)行效率與開發(fā)效率比較Python和C++

    從運(yùn)行效率與開發(fā)效率比較Python和C++

    今天小編就為大家分享一篇關(guān)于從運(yùn)行效率與開發(fā)效率比較Python和C++,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • Python編寫Windows Service服務(wù)程序

    Python編寫Windows Service服務(wù)程序

    這篇文章主要為大家詳細(xì)介紹了Python編寫Windows Service服務(wù)程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Python中http請求方法庫匯總

    Python中http請求方法庫匯總

    最近在使用python做接口測試,發(fā)現(xiàn)python中http請求方法有許多種,今天抽點(diǎn)時間把相關(guān)內(nèi)容整理,對python http請求相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧
    2016-01-01
  • Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)填充和步幅的理解

    Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)填充和步幅的理解

    這篇文章主要介紹了Python深度學(xué)習(xí)pytorch神經(jīng)網(wǎng)絡(luò)填充和步幅的理解
    2021-10-10

最新評論

连平县| 高唐县| 施秉县| 长治市| 镇雄县| 化德县| 通道| 游戏| 秀山| 根河市| 罗平县| 桓台县| 开化县| 天气| 射阳县| 开封县| 理塘县| 漳浦县| 四川省| 息烽县| 陵川县| 老河口市| 兴化市| 大竹县| 如东县| 伊吾县| 思茅市| 清丰县| 塔城市| 东港市| 都兰县| 达孜县| 大丰市| 石首市| 台安县| 大关县| 包头市| 织金县| 永宁县| 沙雅县| 新余市|