講完了影像侵蝕,我們接著來講影像膨脹。
和cv2.erode
相同,cv2.dilate
只能用於二值化後的圖片,所以我們一樣把移動偵測的程式碼拿來用:
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)
我們在底下加上一行:
dilated = cv2.dilate(th, (3,3), iterations=1)
cv2.dilate
的第一個參數為二值化的影像,所以我們直接帶入變數th
。
和cv2.erode
一樣,第二個參數同樣是卷積核心的大小!這兩個函數的差別只在於一個只要核心範圍的元素值不全是1,重新賦予的值就全是0(侵蝕),一個只要核心範圍的元素值出現1,重新賦予的值就全是1(膨脹)。
第三個參數也和cv2.erode
一樣是迭代次數,不需要去改動它。
影像膨脹通常是配合影像侵蝕使用,先用侵蝕函數將圖片中的輪廓變細,同時去除多餘毛點,之後再用影像膨脹函數將輪廓恢復正常大小,使圖片看上去更加清晰。
所以我們可以在移動偵測的程式碼做點改動:先把二值化後的圖片用cv2.erode
侵蝕一次,再用cv2.dilate
把輪廓膨脹回來,同時做到去除毛點和輪廓清晰化。
以上就是形態學的兩種影像處理函數了,隨著本章的結束,我的三十天鐵人賽也宣告完結。
經過這次比賽的經驗,我對OpenCV
的應用有了更為深入的了解,希望這三十天的學習紀錄也能替後來的人起到一些幫助,如果剛開始學影像處理的初學者們能在我的參賽文章裡找到有用的知識,那我也會很高興的。
謝謝觀看。