首頁 > 軟體

Python OpenCV形態學運算範例詳解

2022-04-07 19:01:03

1. 腐蝕 & 膨脹

1.1什麼是腐蝕&膨脹

腐蝕&膨脹是影象形態學中的兩種核心操作

腐蝕可以描述為是讓影象沿著自己的邊界向內收縮

而膨脹則剛好與收縮相反,可以描述為是讓影象沿著邊界向內擴張。

這兩種操作的邏輯和作用都和上篇講到的使用濾波器做平滑處理有些類似,不同之處在於,腐蝕求的是濾波核內畫素的最小值,而膨脹求的是最大值。並將計算出的值複製給錨點位置的畫素。

作用上同平滑處理類似,可以消除噪聲。

因為腐蝕求的是最小值,膨脹求的是最大值,所以經過腐蝕操作的影象的總體亮度會有所降低,而經過膨脹操作的影象的總體亮度會有所升高。

為方便範例,準備以下圖片素材(test1.jpg):

1.2 腐蝕方法 cv2.erode()

python中OpenCV使用cv2.erode()方法實現腐蝕操作。

該方法語法如下:

cv2.erode(src, kernel, anchor=None, iterations=None, borderType=None, borderValue=None)

  • scr 原影象
  • kernel 腐蝕要用到的核
  • anchor 錨點
  • iterations 可選引數,腐蝕操作的迭代次數,預設為1。
  • borderType 邊界樣式,可選。
  • borderValue 邊界值,可選。

其中kernel這個引數,核,需要手動取建立一個陣列,而不能是像濾波器那樣指定一個大小。

import cv2
import numpy as np
img = cv2.imread("test1.jpg")
# 建立3*3的陣列作為濾波核
k = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

腐蝕效果如下,如圖,我們的魚骨顯得年代更久遠了,魚刺消失、變暗了相當一部分。

1.3 膨脹方法 cv2.dilate()

python中OpenCV使用cv2.dilate()方法實現膨脹操作。

該方法語法如下:

dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

可以看出,其引數用法同cv2.erode()的引數。

import cv2
import numpy as np
img = cv2.imread("test1.jpg")
# 建立16*16的陣列作為核
k = np.ones((16, 16), np.uint8)
dst = cv2.dilate(img, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

膨脹效果如下,如圖所示,圖片眾多魚的亮度明顯變高了。

這種影象效果,也被稱之為“近視眼”效果。

2. 開運算 & 閉運算

2.1 簡述

開運算就是將影象先進性腐蝕操作,再進行膨脹操作。其可以用來抹除影象外部的細節(噪聲)。

閉運算則與之相反

閉運算是先對影象進行膨脹操作,在進行腐蝕操作。其可以用來抹除影象的內部細節(噪聲)。

腐蝕和膨脹雖然是逆操作,但是開運算和閉運算都不會使影象恢復原狀。

2.2 開運算

以 3 為核

程式碼範例如下

import cv2
import numpy as np
img = cv2.imread("test1.jpg")
k = np.ones((3, 3), np.uint8)
dst = cv2.erode(img, k)
dst = cv2.dilate(dst, k)
cv2.imshow("dst", dst)
cv2.waitKey()  
cv2.destroyAllWindows()  

2.3 閉運算

以 10 為核

程式碼範例如下

import cv2
import numpy as np
img = cv2.imread("test1.jpg")
k = np.ones((10, 10), np.uint8)
dst = cv2.dilate(img, k)
dst = cv2.erode(dst, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

3. morphologyEx()方法

3.1 morphologyEx()方法 介紹

在python中OpenCV還提供了morphologyEx()方法(形態學方法),可以用來完成所有常用的形態學運算。

morphologyEx()語法如下:

morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)

其中

  • scr 表示影象
  • op 表示操作型別
  • kernel 表示 核
  • anchor 表示錨點
  • iterations 為迭代次數,預設為1
  • borderType 是邊界樣式,預設1
  • borderValue 是邊界值,預設1

可以供op選擇的操作型別有:

引數值描述
cv2.MORPH_ERODE腐蝕
cv2.MORPH_DILATE膨脹
cv2.MORPH_ OPEN開運算,先腐蝕後膨脹
cv2.MORPH_CLOSE閉運算,先膨脹後腐蝕
cv2.MORPH_GRADIENT梯度運算,膨脹圖減腐蝕圖
cv2.MORPH_TOPHAT頂帽運算,原始圖減開運算圖
cv2.MORPH_BLACKHAT黑帽運算,閉運算圖,減開運算圖

接下來我們使用圖片"test2.jpg"(下圖)來繼續下邊的範例:

3.2 梯度運算

對“test2.jpg”以 4 為核做梯度運算:

import cv2
import numpy as np
img = cv2.imread("test2.jpg")  
k = np.ones((4, 4), np.uint8)  
dst = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, k) 
cv2.imshow("dst", dst)  
cv2.waitKey()  
cv2.destroyAllWindows()  

梯度運算,即膨脹圖減去腐蝕圖,因為膨脹運算得到的影象中我物體比原圖中的“大”,而腐蝕運算得到的影象中的物體是收縮過的,比原圖中的“小”,所以膨脹的結果減去腐蝕的結果,會得到一個大概的、不精準的輪廓。

test2.jpg梯度運算執行效果如下:

3.3 頂帽運算

對“test2.jpg”以 4 為核做頂帽運算:

import cv2
import numpy as np
img = cv2.imread("test2.jpg")
k = np.ones((4, 4), np.uint8)
cv2.imshow("img", img)
dst = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

頂帽運算,即原圖減去開運算圖,因為開運算抹除了影象的外部細節,所以頂帽運算即“有外部細節的影象 減去 無外部細節的影象”,得到的結果也就只剩外部細節了。

頂帽運算處理效果如下:

3.4 黑帽運算

對“test2.jpg”以 4 為核做頂帽運算:

import cv2
import numpy as np
img = cv2.imread("test2.jpg")
k = np.ones((4, 4), np.uint8)
dst = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()

黑帽運算,即原影象的閉運算減去原影象

因為閉運算可以抹除影象的內部細節,所以黑帽運算即 “無內部細節的影象減去有內部細節的影象”,結果只剩下內部細節。

黑帽運算處理效果如下:

以上就是Python OpenCV形態學運算範例詳解的詳細內容,更多關於Python OpenCV形態學運算的資料請關注it145.com其它相關文章!


IT145.com E-mail:sddin#qq.com