iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 12
1

當我們使用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()

程式執行之後,可以顯而易見的看出各種二值化類型的差別,具體設置視使用者需求而定。


上一篇
Day11-影像邊緣偵測
下一篇
Day13-平滑模糊化
系列文
OpenCV 從零開始的影像處理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言