當我們使用Python語言在進行手勢辨識和車牌辨識等程式撰寫時,常會需要將圖片轉成只有黑與白兩色的黑白圖片來做後續處理,而在OpenCV的函式庫中已經有一個功能完善的二值轉化函式―—cv2.threshold,可以滿足我們的需求。
import cv2
import numpy as np
from matplotlib import pyplot as plt
這裡可以注意到我們import了一個新的函式庫,matplotlib是一個類似matlab的圖形處理套件,pyplot是它其中一個模塊,我們將會用到這個函式庫的繪圖功能。
cv2.threshold函式的轉換方法,是將像素值pixel大於門檻值threshold的像素格指定一個新數值(如白色),如果像素值pixel小於門檻值threshold則反之(如黑色)。
img = cv2.imread('image.jpg', 0)
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
可以看到上面的cv2.threshold函式內部帶有四個參數,分別是灰階圖片、門檻值、最大灰階值和二值化的類型。上面的設定運行後會將深度大於127的像素轉成最大灰階值255,深度小於127的像素則轉成0,只餘255和0兩色。
二值化的類型除了基本的cv2.THRESH_BINARY
黑白轉換,還有:cv2.THRESH_BINARY_INV
白黑轉換。cv2.THRESH_TRUNC
將大於門檻值的灰階值設為門檻值,小於門檻值的值保持不變。cv2.THRESH_TOZERO
將小於門檻值的灰階值設為0,大於門檻值的值保持不變。cv2.THRESH_TOZERO_INV
將大於門檻值的灰階值設為0,小於門檻值的值保持不變。
試著把每個類型都印出來看看吧:
img = cv2.imread('image.jpg', 0)
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, th2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
ret, th3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
ret, th4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
ret, th5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
這裡寫一個兩個list和for迴圈對應:
titles = ['Original Image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, th1, th2, th3, th4, th5]
使用plt的函數,在迴圈內部對每個二值化後的變數做簡易繪圖:
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()
程式執行之後,可以顯而易見的看出各種二值化類型的差別,具體設置視使用者需求而定。