基於Python的Opencv學習

基於Python的Opencv學習第六天

這是我學習Opencv的第六天,來看看今天給大家介紹的內容吧。

閾值分割

一.基礎理論

閾值很容易理解,就通俗來說就是一個標準,所有東西都得和這個標準進行比較,從而得到大於閾值和小於閾值兩部分,然後再分別作出不同處理。
在這裏插入圖片描述
這是Opencv官網上面一張圖,接下來,我們將對這幅圖進行介紹,來了解閾值幾種不同的閾值分割。

首先來看一下原始圖像像素值分佈圖:
在這裏插入圖片描述
其中縱座標代表像素值的大小,從0~255,紅色線代表着閾值,像素點的大小分佈在閾值兩側,最大達到255,最小達到0。

來看看常見的五種閾值化分割:

Ⅰ.二進制閾值化
這種分割
先要選定一個特定的閾值量,比如:128
新的閾值產生的規則是:
①大於等於128的像素點的灰度值設定爲最大值(最大值如8位灰度值最大爲255)
②灰度值小於128的像素點的灰度值設定爲0

公式爲:
在這裏插入圖片描述
示例:選定閾值爲128
159—>255
105—>0
205—>255
98—>0

在這裏插入圖片描述
在這裏插入圖片描述
這裏對比上下兩幅圖可以看到,從鋸齒型圖變成了方波型圖。

Ⅱ.反二進制閾值化
該閾值化和二進制閾值化相似,先選定一個特定的灰度圖爲閾值(以8位灰度圖爲例):
大於等於閾值的設定爲0
小於閾值的設定爲255

在這裏插入圖片描述
在這裏插入圖片描述
這裏不做過多贅述,就是和二進制閾值化結果取反。

Ⅲ.截斷閾值化
這個閾值化是,首先選定一個閾值,圖像中大於該閾值的像素點被設定爲該閾值,小於該閾值的保持不變。
示例:閾值選取爲127,則
小於127的閾值保持不變
大於等於127的像素點設定爲該閾值127
在這裏插入圖片描述
在這裏插入圖片描述
這裏就是在圖形上面體現截斷閾值化。

Ⅳ.反閾值化爲零
這裏的閾值化爲零就是:
先選定一個閾值,然後進行如下處理:
大於等於該閾值的像素點,值變爲0;
小於該閾值的像素點,值保持不變。

示例:選定閾值爲128
159—>0
105—>105
205—>0
98—>98
在這裏插入圖片描述
在這裏插入圖片描述
這裏我們看到大於等於閾值的像素點全都爲零

Ⅴ.閾值化爲零
理解了反閾值化爲零之後,來講閾值化爲零就方便多了。這個閾值化爲零就是:
先選定一個閾值,然後對圖像進行如下處理:
大於等於閾值的像素點,其值保持不變
小於該閾值的像素點,值變爲0

在這裏插入圖片描述
在這裏插入圖片描述
這裏和閾值化爲零,以及反二進制化閾值結合起來理解就相當容易,我就不過多贅述。

二.圖像閾值threshold及實現閾值分割

在圖像閾值分割時,我們需要調用threshold(),具體語法如下:

retval,dst=cv2.threshold(src,thresh,maxval,type)

來講一下返回值含義:
retval:閾值,此處閾值和thresh一致,即指定閾值多少將得到閾值多少;
dst:處理結果,這裏指我們對一幅圖像進行處理之後得到的結果圖像。

來看一下各個參數含義:
src:需要處理的原圖像
thresh:指我們設定的閾值
maxval:指我們閾值分割時候的指定的最大值(可以是1或者255)
type:指在上述講的五種類型分割中選一種

Ⅰ.二進制閾值化
在二進制閾值化中,關鍵字是cv2.THRESH_BINARY

示例:
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY)

>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.gray.jpg")
>>> r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY)
>>> cv2.imshow("a",a)
>>> cv2.imshow("b",b)
>>> 

在這裏插入圖片描述
這裏我們可以看到左邊爲原始灰度圖像a,右邊是進行二進制閾值化之後得到的圖像b,這裏超過閾值127的變爲最大值255(即純白色),小於閾值127的變爲最小值0(即純黑色)。因爲在opencv中最小值0代表純黑,最大值255代表着純白,這在我第一篇博客就講到過。

Ⅱ.反二進制閾值化
在二進制閾值化中,關鍵字是cv2.THRESH_BINARY_INV

示例:
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY_INV)

>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.gray.jpg")
>>> r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY_INV)
>>> cv2.imshow("b",b)
>>> cv2.imshow("a",a)
>>> 

在這裏插入圖片描述
這裏大於閾值的像素點處理爲最小值0,小於或者等於閾值的像素點處理爲最大值255,結果展示如上兩幅圖。

Ⅲ.截斷閾值化
在二進制閾值化中,關鍵字是cv2.THRESH_TRUNC
示例:
r,b=cv2.threshold(a,127,255,cv2.THRESH_TRUNC)

>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.gray.jpg")
>>> r,b=cv2.threshold(a,127,255,cv2.THRESH_TRUNC)
>>> cv2.imshow("b",b)
>>> cv2.imshow("a",a)
>>> 

在這裏插入圖片描述
這裏截斷閾值化值的是所有大於等於閾值的像素點變成閾值的值,所有小於閾值的值保持不變。所有右上圖看出,白的部分全都變成了閾值要求的灰色,而黑色部分沒有改變。

Ⅳ.反閾值化爲零
在二進制閾值化中,關鍵字是cv2.THRESH_TOZERO_INV
示例:
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO_INV)

>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.gray.jpg")
>>>> cv2.imshow("a",a)
>>> r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO_INV)
>>> cv2.imshow("b",b)
>>> 

在這裏插入圖片描述
這裏大於閾值的像素點變爲最小值0,小於等於閾值的像素點保持不變,導致右上圖中,大部分白色部分均變成了黑色(即最小值0)。

Ⅴ.閾值化爲零
在二進制閾值化中,關鍵字是cv2.THRESH_TOZERO
示例:
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO)

>>> a=cv2.imread(r"C:\Users\LT010407\Desktop\2.gray.jpg")
>>>> r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO)
>>> cv2.imshow("b",b)
>>>cv2.imshow("a",a)

在這裏插入圖片描述
這裏小於閾值像素點的部分變爲最小值0(即最黑色),而大於等於閾值的像素點的值保持不變。

今天只講了閾值分割的概念和代碼實現,代碼比較簡單,只要弄懂參數意思就能實現想要的結果,如果有不明白最好要結合概念來理解。OK,今天就到這裏,我們下一篇博客再見。(轉載註明出處)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章