iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 29
1

上章我們在進行圖像輪廓增強的處理時,有用到影像膨脹函數cv2.dilate,但那時候只是稍微帶過,讀者們可能不太明白cv2.dilate的參數設置。

本來應該補充說明的,但為了方便大家理解,在介紹cv2.dilate之前,我們要先來講講和膨脹函數的功能相反的函數cv2.erode

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變數印出來看看,會看到輪廓比起原圖更加纖細,而且背景的細小毛點被除去了很多!


上一篇
Day28-移動偵測2
下一篇
Day30-影像膨脹
系列文
OpenCV 從零開始的影像處理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
draguitar
iT邦新手 4 級 ‧ 2022-10-13 09:19:13

t0 >> img1
t1 >> img2
grey1 >> gray1
grey2 >> gray2

感謝分享OPENCV

我要留言

立即登入留言