opencv圖像閾值

1.簡單閥值cv2.threshold()

當(dāng)像素值高于閥值時(shí)字管,我們給這個(gè)像素賦予一個(gè)新值(可能是白色)拓诸,否則我們給它賦予另外一種顏色(也許是黑色)蒙秒。這個(gè)函數(shù)就是cv2.threshold()。函數(shù)的第一個(gè)參數(shù)就是原圖像剃幌,原圖像應(yīng)該是灰度圖聋涨。第二個(gè)參數(shù)就是用來對(duì)像素值進(jìn)行分類的閥值,第三個(gè)參數(shù)就是當(dāng)像素值高于(有時(shí)小于)閥值時(shí)负乡,應(yīng)該被賦予新的像素值。OpenCV提供了多種不同的閥值方法脊凰,這是由第四個(gè)參數(shù)來決定的抖棘。方法主要包括:

cv2.THRESH_BINARY

cv2.THRESH_BINARY_INV

cv2.THRESH_TRUNC

cv2.THRESH_TOZERO

cv2.THRESH_TOZERO_INV

img = cv2.imread('NBA.png')

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 = ['Original Image','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()


2.自適應(yīng)閾值???cv2.adaptiveThreshold()

在上面茂腥,我們使用全局值作為閾值。但是圖像在不同區(qū)域中具有不同亮度切省,用一樣的閾值處理最岗,結(jié)果是不太良好的。在這種情況下朝捆,我們進(jìn)行自適應(yīng)閾值處理般渡。根據(jù)圖像上的每一個(gè)小區(qū)域計(jì)算與其對(duì)應(yīng)的閥值。因此在同一幅圖像上的不同區(qū)域采用的是不同的閥值芙盘,從而使我們能在亮度不同的情況下得到更好的結(jié)果驯用。

這種方法需要我們指定三個(gè)參數(shù),返回值只有一個(gè)儒老。

Adaptive Method 指定計(jì)算閥值的方法

? ? cv2.ADAPTIVE_THRESH_MEAN_C:閥值取自相鄰區(qū)域的平均值

? ? cv2.ADAPTIVE_THRESH_GAUSSIAN_C:閥值取自相鄰區(qū)域的加權(quán)和蝴乔,權(quán)重為一個(gè)高斯窗口

Block Size 鄰域大小(用來計(jì)算閥值的區(qū)域大型苑)

C這就是一個(gè)常數(shù)薇正,閥值就等于的平均值或者加權(quán)平均值減去這個(gè)常數(shù)

img = cv2.imread('NBA.png',0)

img = cv2.medianBlur(img,5)? ?#中值濾波

ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

# 11為block size,2為C值

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)

titles = ['Original Image', 'Global Thresholding (v = 127)', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']

images = [img, th1, th2, th3]

for i in range(4):

????plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')

????plt.title(titles[i])

????plt.xticks([]),plt.yticks([])

plt.show()


3.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躏筏。

img = cv2.imread('rectangle.jpg',0)? #建議找一張簡單點(diǎn)的圖片,這樣更容易看出不同的地方在哪里

# global thresholding

ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

# Otsu's thresholding

ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# Otsu's thresholding after Gaussian filtering

blur = cv2.GaussianBlur(img,(5,5),0)

ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

# plot all the images and their histograms

images = [img, 0, th1, img, 0, th2, blur, 0, th3]

titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)', 'Original Noisy Image','Histogram',"Otsu's Thresholding", 'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]

for i in range(3):

????plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')

????plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])

????plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)

????plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])

????plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')

????plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])

plt.show()


上面演示Otsu二進(jìn)制化的Python實(shí)現(xiàn)呈枉,以顯示它實(shí)際上是如何工作的趁尼。如果你不感興趣埃碱,你可以跳過這個(gè)。

由于我們正在處理雙峰圖像酥泞,Otsu的算法試圖找到閾值( t )砚殿,該閾值最小化由以下關(guān)系式給出的加權(quán)類內(nèi)方差:


它實(shí)際上找到位于兩個(gè)峰值之間的t值,使得兩個(gè)類別的方差最小芝囤。它可以簡單地用Python實(shí)現(xiàn)似炎,如下所示:

img = cv2.imread('NBA.jpg',0)

blur = cv2.GaussianBlur(img,(5,5),0)

# find normalized_histogram, and its cumulative distribution function

hist = cv2.calcHist([blur],[0],None,[256],[0,256])

hist_norm = hist.ravel()/hist.max()

Q = hist_norm.cumsum()

bins = np.arange(256)

fn_min = np.inf

thresh = -1

for i in range(1,256):

????p1,p2 = np.hsplit(hist_norm,[i]) # probabilities

????q1,q2 = Q[i],Q[255]-Q[i] # cum sum of classes

????b1,b2 = np.hsplit(bins,[i]) # weights?

????# finding means and variances

????m1,m2 = np.sum(p1*b1)/q1, np.sum(p2*b2)/q2

????v1,v2 = np.sum(((b1-m1)**2)*p1)/q1,np.sum(((b2-m2)**2)*p2)/q2

????# calculates the minimization function

????fn = v1*q1 + v2*q2

????if fn < fn_min:

????????fn_min = fn

????????thresh = i

# find otsu's threshold value with OpenCV function

ret, otsu = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)

print(thresh,ret)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市悯姊,隨后出現(xiàn)的幾起案子羡藐,更是在濱河造成了極大的恐慌,老刑警劉巖挠轴,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件传睹,死亡現(xiàn)場離奇詭異,居然都是意外死亡岸晦,警方通過查閱死者的電腦和手機(jī)欧啤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來启上,“玉大人邢隧,你說我怎么就攤上這事「栽冢” “怎么了倒慧?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長包券。 經(jīng)常有香客問我纫谅,道長,這世上最難降的妖魔是什么溅固? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任付秕,我火速辦了婚禮,結(jié)果婚禮上侍郭,老公的妹妹穿的比我還像新娘询吴。我一直安慰自己,他們只是感情好亮元,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布猛计。 她就那樣靜靜地躺著,像睡著了一般爆捞。 火紅的嫁衣襯著肌膚如雪奉瘤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天嵌削,我揣著相機(jī)與錄音毛好,去河邊找鬼望艺。 笑死苛秕,一個(gè)胖子當(dāng)著我的面吹牛肌访,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艇劫,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼吼驶,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了店煞?” 一聲冷哼從身側(cè)響起蟹演,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顷蟀,沒想到半個(gè)月后酒请,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸣个,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年羞反,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囤萤。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡昼窗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出涛舍,到底是詐尸還是另有隱情澄惊,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布富雅,位于F島的核電站掸驱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏没佑。R本人自食惡果不足惜毕贼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望图筹。 院中可真熱鬧帅刀,春花似錦、人聲如沸远剩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瓜晤。三九已至锥余,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間痢掠,已是汗流浹背驱犹。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國打工嘲恍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人雄驹。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓佃牛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親医舆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子俘侠,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容