1. 程式人生 > 實用技巧 >[Python影象處理]九.影象形態學相關運算

[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