上章我們在進行圖像輪廓增強的處理時,有用到影像膨脹函數cv2.dilate
,但那時候只是稍微帶過,讀者們可能不太明白cv2.dilate
的參數設置。
本來應該補充說明的,但為了方便大家理解,在介紹cv2.dilate
之前,我們要先來講講和膨脹函數的功能相反的函數cv2.erode
。
cv2.erode
是一個影像侵蝕函數,光聽名字就知道功能和cv2.dilate
完全相反。cv2.erode
只能用於經過二值化運算的灰階圖片,可起到圖片去噪、細化影像和消除毛刺的作用。
而既然需要用到二值化圖片,那我們就沿用前兩章的程式碼:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
img1 = cap.read()[1]
img2 = cap.read()[1]
# 彩色圖轉灰階圖
gray1 = cv2.cvtColor(t0, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(t1, cv2.COLOR_BGR2GRAY)
# 高斯模糊化處理
blur1 = cv2.GaussianBlur(grey1,(5,5),0)
blur2 = cv2.GaussianBlur(grey2,(5,5),0)
result = cv2.absdiff(blur1, blur2)
# 二值化處理
ret, th = cv2.threshold(result, 15, 255, cv2.THRESH_BINARY)
我們在底下加上一行:
erosion = cv2.erode(th, (3,3), iterations = 1)
cv2.erode
的第一個參數為二值化的影像,所以我們直接帶入變數th
。
第二個參數為使用的卷積kernel
——影像侵蝕的原理是透過卷積核心沿著圖片滾動並計算元素值,如果卷積核心範圍內的元素值都是1(即白色),那麼重新賦予的元素值就保持原來的值。反之如果核心範圍內的元素值不全為1,重新賦予的元素值為0(即黑色),這表示卷積核心經過的所有像素如果不是全白都會被腐蝕或侵蝕掉(變為0)。
卷積核心的大小通常設定為奇數,如上面程式碼設定的3x3,也可以等差設定上去,如5x5、7x7、9x9,核心越大侵蝕的範圍也會越大。
第三個參數為迭代次數,通常預設為1,不用特別去動它。
把erosion
變數印出來看看,會看到輪廓比起原圖更加纖細,而且背景的細小毛點被除去了很多!
t0 >> img1
t1 >> img2
grey1 >> gray1
grey2 >> gray2
感謝分享OPENCV