OpenCV學習之圖像形態學處理詳解
本文是OpenCV圖像視覺入門之路的第11篇文章,本文詳細的在圖像形態學進行瞭圖像處理,例如:腐蝕操作、膨脹操作、開閉運算、梯度運算、Top Hat Black Hat運算等操作。
1.腐蝕操作
從下面代碼中可以看到有三幅腐蝕程度不同的圖,腐蝕越嚴重像素就越模糊
import cv2 import numpy as np from numpy import unicode if __name__ == '__main__': img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) kernel = np.ones((3, 3), np.uint8) erosion = cv2.erode(img1, kernel) cv2.imshow("img1", erosion) # 顯示疊加圖像 dst img2 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) kernel = np.ones((10, 10), np.uint8) erosion_1 = cv2.erode(img2, kernel) cv2.imshow('erosion_1', erosion_1) img3 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) kernel = np.ones((30, 30), np.uint8) erosion_2 = cv2.erode(img3, kernel) cv2.imshow('erosion_2', erosion_2) cv2.waitKey(0) cv2.destroyAllWindows()
binary_img = np.array([ [0, 0, 0, 0, 0], [0,255,255,255,0], [0,255,255,255,0], [0,255,255,255,0], [0, 0, 0, 0, 0]],np.uint8) ones((3,3),np.uint8) [[ 0 0 0 0 0] [ 0 0 0 0 0] [ 0 0 255 0 0] [ 0 0 0 0 0] [ 0 0 0 0 0]]
通過上面的例子發現,經過3×3的kernel之後,最終隻保留瞭中心的255像素,周邊的255都變成瞭0。在進行腐蝕操作的時候,就是通過kernel大小的卷積在原圖像上滑動,隻有當kernel范圍內的像素全為255時輸出才為255,否則輸出為0,所以kernel越大最終白色像素保留的會越少。
2.膨脹操作
圖像經過膨脹之後,白色像素的范圍變大瞭。在做膨脹的時候,隻要當kernel范圍內的像素有255時輸出就為255。
3.開閉運算
開運算其實就是先通過腐蝕操作後面再進行膨脹,閉運算和開運算恰好相反先通過膨脹操作後面再進行腐蝕。
import cv2 import numpy as np from numpy import unicode if __name__ == '__main__': img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) # 定義kernel kernel = np.ones((3, 3), np.uint8) # 開運算 open_img = cv2.morphologyEx(img1, cv2.MORPH_OPEN, kernel) # 閉運算 close_img = cv2.morphologyEx(img1, cv2.MORPH_CLOSE, kernel) cv2.imshow("open_img", open_img) # 顯示疊加圖像 dst cv2.imshow("close_img", close_img) # 顯示疊加圖像 dst cv2.waitKey(0) cv2.destroyAllWindows()
4.梯度運算
梯度運算等價於膨脹運算-腐蝕運算 梯度運算主要是用來保留圖像的輪廓
5.Top Hat Black Hat運算
Top Hat運算等價於原始圖像 – 開運算,Black Hat運算等價於閉運算 – 原始圖像
形態學Top-Hat變換是指形態學頂帽操作與黑帽操作,前者是計算源圖像與開運算結果圖之差,後者是計算閉運算結果與源圖像之差。
形態學Top-Hat變換是常用的一種濾波手段,具有高通濾波的某部分特性,可實現在圖像中檢測出周圍背景亮結構或周邊背景暗結構。
頂帽操作常用於檢測圖像中的峰結構。
黑帽操作常用於檢測圖像中的波谷結構。
import cv2 import numpy as np from numpy import unicode if __name__ == '__main__': img1 = cv2.imread("D:/Jupyter_Notebooks/0.jpg") # 讀取彩色圖像(BGR) # 定義kernel kernel = np.ones((3, 3), np.uint8) tophat_img = cv2.morphologyEx(img1, cv2.MORPH_TOPHAT, kernel) blackhat_img = cv2.morphologyEx(img1, cv2.MORPH_BLACKHAT, kernel) cv2.imshow("tophat_img", tophat_img) # 顯示疊加圖像 dst cv2.imshow("blackhat_img", blackhat_img) # 顯示疊加圖像 dst cv2.waitKey(0) cv2.destroyAllWindows()
以上就是OpenCV學習之圖像形態學處理詳解的詳細內容,更多關於OpenCV圖像形態學處理的資料請關註WalkonNet其它相關文章!