[Python影象處理]九.影象形態學相關運算
影象開運算
影象開運算是影象依次經過腐蝕,膨脹處理後的過程。影象被腐蝕後,去除了噪聲,但是也壓縮了影象;接著對腐蝕過的影象進行膨脹處理,可以去除噪聲,並保留原有影象。
開運算=膨脹
影象開運算主要使用函式morphologyEx,它是形態學拓展的一組函式,其引數cv2.MORPH_OPEN對應開運算,其原型如下:
dst = cv2.morphologyEx(src, cv2.MORPH,kernel)
程式碼如下:
import cv2 import numpy as np src = cv2.imread("src.png", cv2.IMREAD_UNCHANGED) # 設定卷積核 kernel = np.ones((5, 5), np.uint8)# 影象開運算 result = cv2.morphologyEx(src, cv2.MORPH_OPEN, kernel) # 顯示影象 cv2.imshow("src", src) cv2.imshow("result", result) if cv2.waitKey() == 27: cv2.destroyAllWindows()
效果如下
結果仍然存在噪聲,可以增大卷積核面積消除噪聲,例如設定為10*10,效果如下:
影象閉運算
影象閉運算是影象依次經過膨脹,腐蝕處理後的過程。影象先膨脹,後腐蝕,它有助於關閉前景物理內部的小孔或物體上的小黑點。
閉運算=腐蝕
主要使用morphologyEx函式
dst = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel)
程式碼如下:
import cv2 import numpy as np src = cv2.imread("src.png", cv2.IMREAD_UNCHANGED) # 設定卷積核 kernel = np.ones((10, 10), np.uint8) # 影象開運算 result = cv2.morphologyEx(src, cv2.MORPH_CLOSE, kernel) # 顯示影象 cv2.imshow("src", src) cv2.imshow("result", result)if cv2.waitKey() == 27: cv2.destroyAllWindows()
效果如下:
影象梯度運算
影象梯度運算時膨脹影象減去腐蝕影象的結果,得到影象的輪廓圖,其中二值影象1表示白色,0表示黑色。
梯度運算 = 膨脹-腐蝕
主要使用morphologyEx函式
dst = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
程式碼如下:
import cv2 import numpy as np src = cv2.imread("src.png", cv2.IMREAD_UNCHANGED) # 設定卷積核 kernel = np.ones((10, 10), np.uint8) # 影象開運算 result = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel) # 顯示影象 cv2.imshow("src", src) cv2.imshow("result", result) if cv2.waitKey() == 27: cv2.destroyAllWindows()
效果如下:
影象頂帽運算
影象頂帽運算時原始影象減去影象開運算的結果,得到影象的噪聲。
頂帽運算=原始影象-開運算
dst = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
程式碼如下:
import cv2 import numpy as np src = cv2.imread("src.png", cv2.IMREAD_UNCHANGED) # 設定卷積核 kernel = np.ones((5, 5), np.uint8) # 影象開運算 result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel) # 顯示影象 cv2.imshow("src", src) cv2.imshow("result", result) if cv2.waitKey() == 27: cv2.destroyAllWindows()
效果如下:
獲取更多細節,可以加大卷積核的面積,例如10*10
影象黑帽運算
影象黑帽運算是影象閉運算操作減去原始影象的結果,得到影象內部的小孔,或者前景中的小黑點
黑帽運算=閉運算-原始影象
dst = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
程式碼如下:
import cv2 import numpy as np src = cv2.imread("src.png", cv2.IMREAD_UNCHANGED) # 設定卷積核 kernel = np.ones((10, 10), np.uint8) # 影象開運算 result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel) # 顯示影象 cv2.imshow("src", src) cv2.imshow("result", result) if cv2.waitKey() == 27: cv2.destroyAllWindows()
效果如下:
轉自:https://blog.csdn.net/Eastmount/article/details/83692456