Python 圖像處理 OpenCV (6):圖像的閾值處理
前文傳送門:
「Python 圖像處理 OpenCV (1):入門」
「Python 圖像處理 OpenCV (2):像素處理與 Numpy 操作以及 Matplotlib 显示圖像」
「Python 圖像處理 OpenCV (3):圖像屬性、圖像感興趣 ROI 區域及通道處理」
「Python 圖像處理 OpenCV (4):圖像算數運算以及修改顏色空間」
「Python 圖像處理 OpenCV (5):圖像的幾何變換」
圖像的閾值
看到這個詞可能大家都很懵,為啥在圖像處理裏面還會有閾值。
圖像的閾值處理用大白話講就是將圖像轉化為二值圖像(黑白圖),目的是用來提取圖像中的目標物體,將背景和噪聲區分開(可以近似的認為除了目標全是噪聲)。
通常會設定一個閾值 T ,通過 T 將圖像的像素劃分為兩類:大於 T 的像素群和小於 T 的像素群。
首先可以先將圖像轉化為灰度圖像,因為在灰度圖像中,每個像素都只有一個灰度值用來表示當前像素的亮度。
接下來二值化處理可以將圖像中的像素劃分為兩類顏色,一種是大於閾值 T 的,另一種是小於閾值 T 的。
比如最常見的二值圖像:
當灰度值小於閾值 T 的時候,可以將其像素設置為 0 ,表示為黑色。
當灰度值大於閾值 T 的時候,可以將其像素設置為 255 ,表示為白色。
在 OpenCV 中,為我們提供了閾值函數 threshold()
來幫助我們實現二值圖像的處理。
函數如下:
retval, dst = threshold(src, thresh, maxval, type, dst=None)
- retval: 閾值
- dst: 處理后的圖像
- src: 原圖像
- thresh: 閾值
- maxval: 最大值
- type: 處理類型
常用的 5 中處理類型如下:
- cv.THRESH_BINARY: 二值處理
- cv.THRESH_BINARY_INV: 反二值處理
- cv.THRESH_TRUNC: 截斷閾值化
- cv.THRESH_TOZERO: 閾值化為 0
- cv.THRESH_TOZERO_INV: 反閾值化為 0
接下來這幾種處理類型有啥不同,我們一個一個來看。
二值處理
這種二值處理方式最開始需要選定一個閾值 T ,從 0 ~ 255 之間,我這裏選擇出於中間的那個數 127 。
接下來的處理規則就是這樣的:
- 大於等於 127 的像素點的灰度值設定為最大值,也就是 255 白色
- 小於 127 的像素點的灰度值設定為 0 ,也就是黑色
接下來開始寫代碼,看我們的馬里奧同學(不知道你們還記不記得我們的馬里奧同學):
import cv2 as cv
src = cv.imread("maliao.jpg")
# BGR 圖像轉灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# 二值圖像處理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY)
# 显示圖像
cv.imshow("src", src)
cv.imshow("result", b)
# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()
反二值處理
這種方式和上面的二值處理非常相似,只是把處理規則給反了一下:
- 大於等於 127 的像素點的灰度值設定為 0 ,也就是白色
- 小於 127 的像素點的灰度值設定為最大值,也就是 255 白色
完整代碼如下:
import cv2 as cv
src = cv.imread("maliao.jpg")
# BGR 圖像轉灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# 二值圖像處理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY_INV)
# 显示圖像
cv.imshow("src", src)
cv.imshow("result", b)
# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()
從圖像上可以看到,顏色和上面的二值圖像正好相反,大部分的位置都變成了白色。
截斷閾值化
這種方法還是需要先選定一個閾值 T ,圖像中大於該閾值的像素點被設定為該閾值,小於該閾值的保持不變。
完整代碼如下:
import cv2 as cv
src = cv.imread("maliao.jpg")
# BGR 圖像轉灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# 二值圖像處理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TRUNC)
# 显示圖像
cv.imshow("src", src)
cv.imshow("result", b)
# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()
這種方式實際上是把圖片比較亮的像素處理成為閾值,其他部分保持不變。
閾值化為 0
這種方式還是需要先選定一個閾值 T ,將小於 T 的像素點設置為 0 黑色,其他的保持不變。
完整代碼如下:
import cv2 as cv
src = cv.imread("maliao.jpg")
# BGR 圖像轉灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# 二值圖像處理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO)
# 显示圖像
cv.imshow("src", src)
cv.imshow("result", b)
# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()
這個方法是亮的部分不改,把比較暗的部分修改為 0 。
反閾值化為 0
這個和前面的反二值圖像很像,同樣是反閾值化為 0 ,將大於等於 T 的像素點變為 0 ,其餘保持不變。
完整代碼如下:
import cv2 as cv
src = cv.imread("maliao.jpg")
# BGR 圖像轉灰度
gray_img = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
# 二值圖像處理
r, b = cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO_INV)
# 显示圖像
cv.imshow("src", src)
cv.imshow("result", b)
# 等待显示
cv.waitKey(0)
cv.destroyAllWindows()
這個方法是暗的部分不改,把比較亮的部分修改為 0 。
全家福
接下來還是給這幾種閾值處理后的圖像來個全家福,讓大家能有一個直觀的感受,代碼我也給出來,如下:
import cv2 as cv
import matplotlib.pyplot as plt
# 讀取圖像
img=cv.imread('maliao.jpg')
lenna_img = cv.cvtColor(img,cv.COLOR_BGR2RGB)
gray_img=cv.cvtColor(img,cv.COLOR_BGR2GRAY)
# 閾值化處理
ret1, thresh1=cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY)
ret2, thresh2=cv.threshold(gray_img, 127, 255, cv.THRESH_BINARY_INV)
ret3, thresh3=cv.threshold(gray_img, 127, 255, cv.THRESH_TRUNC)
ret4, thresh4=cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO)
ret5, thresh5=cv.threshold(gray_img, 127, 255, cv.THRESH_TOZERO_INV)
# 显示結果
titles = ['Gray Img','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [gray_img, thresh1, thresh2, thresh3, thresh4, thresh5]
# matplotlib 繪圖
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()
示例代碼
如果有需要獲取源碼的同學可以在公眾號回復「OpenCV」進行獲取。
參考
https://blog.csdn.net/Eastmount/article/details/83548652
http://www.woshicver.com/
本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】
※網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!
※網頁設計公司推薦不同的風格,搶佔消費者視覺第一線
※Google地圖已可更新顯示潭子電動車充電站設置地點!!
※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益
※別再煩惱如何寫文案,掌握八大原則!
※網頁設計最專業,超強功能平台可客製化
※回頭車貨運收費標準