Python?OpenCV形態(tài)學運算示例詳解
1. 腐蝕 & 膨脹
1.1什么是腐蝕&膨脹
腐蝕&膨脹是圖像形態(tài)學中的兩種核心操作
腐蝕可以描述為是讓圖像沿著自己的邊界向內(nèi)收縮
而膨脹則剛好與收縮相反,可以描述為是讓圖像沿著邊界向內(nèi)擴張。
這兩種操作的邏輯和作用都和上篇講到的使用濾波器做平滑處理有些類似,不同之處在于,腐蝕求的是濾波核內(nèi)像素的最小值,而膨脹求的是最大值。并將計算出的值復制給錨點位置的像素。
作用上同平滑處理類似,可以消除噪聲。
因為腐蝕求的是最小值,膨脹求的是最大值,所以經(jīng)過腐蝕操作的圖像的總體亮度會有所降低,而經(jīng)過膨脹操作的圖像的總體亮度會有所升高。
為方便示例,準備以下圖片素材(test1.jpg):

1.2 腐蝕方法 cv2.erode()
python中OpenCV使用cv2.erode()方法實現(xiàn)腐蝕操作。
該方法語法如下:
cv2.erode(src, kernel, anchor=None, iterations=None, borderType=None, borderValue=None)
- scr 原圖像
- kernel 腐蝕要用到的核
- anchor 錨點
- iterations 可選參數(shù),腐蝕操作的迭代次數(shù),默認為1。
- borderType 邊界樣式,可選。
- borderValue 邊界值,可選。
其中kernel這個參數(shù),核,需要手動取創(chuàng)建一個數(shù)組,而不能是像濾波器那樣指定一個大小。
import cv2
import numpy as np
img = cv2.imread("test1.jpg")
# 創(chuàng)建3*3的數(shù)組作為濾波核
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()方法實現(xiàn)膨脹操作。
該方法語法如下:
dilate(src, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
可以看出,其參數(shù)用法同cv2.erode()的參數(shù)。
import cv2
import numpy as np
img = cv2.imread("test1.jpg")
# 創(chuàng)建16*16的數(shù)組作為核
k = np.ones((16, 16), np.uint8)
dst = cv2.dilate(img, k)
cv2.imshow("dst", dst)
cv2.waitKey()
cv2.destroyAllWindows()
膨脹效果如下,如圖所示,圖片眾多魚的亮度明顯變高了。

這種圖像效果,也被稱之為“近視眼”效果。
2. 開運算 & 閉運算
2.1 簡述
開運算就是將圖像先進性腐蝕操作,再進行膨脹操作。其可以用來抹除圖像外部的細節(jié)(噪聲)。
閉運算則與之相反
閉運算是先對圖像進行膨脹操作,在進行腐蝕操作。其可以用來抹除圖像的內(nèi)部細節(jié)(噪聲)。
腐蝕和膨脹雖然是逆操作,但是開運算和閉運算都不會使圖像恢復原狀。
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()方法(形態(tài)學方法),可以用來完成所有常用的形態(tài)學運算。
morphologyEx()語法如下:
morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None)
其中
- scr 表示圖像
- op 表示操作類型
- kernel 表示 核
- anchor 表示錨點
- iterations 為迭代次數(shù),默認為1
- borderType 是邊界樣式,默認1
- borderValue 是邊界值,默認1
可以供op選擇的操作類型有:
| 參數(shù)值 | 描述 |
|---|---|
| cv2.MORPH_ERODE | 腐蝕 |
| cv2.MORPH_DILATE | 膨脹 |
| cv2.MORPH_ OPEN | 開運算,先腐蝕后膨脹 |
| cv2.MORPH_CLOSE | 閉運算,先膨脹后腐蝕 |
| cv2.MORPH_GRADIENT | 梯度運算,膨脹圖減腐蝕圖 |
| cv2.MORPH_TOPHAT | 頂帽運算,原始圖減開運算圖 |
| cv2.MORPH_BLACKHAT | 黑帽運算,閉運算圖,減開運算圖 |
接下來我們使用圖片"test2.jpg"(下圖)來繼續(xù)下邊的示例:

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梯度運算執(zhí)行效果如下:

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()
頂帽運算,即原圖減去開運算圖,因為開運算抹除了圖像的外部細節(jié),所以頂帽運算即“有外部細節(jié)的圖像 減去 無外部細節(jié)的圖像”,得到的結果也就只剩外部細節(jié)了。
頂帽運算處理效果如下:

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()
黑帽運算,即原圖像的閉運算減去原圖像
因為閉運算可以抹除圖像的內(nèi)部細節(jié),所以黑帽運算即 “無內(nèi)部細節(jié)的圖像減去有內(nèi)部細節(jié)的圖像”,結果只剩下內(nèi)部細節(jié)。
黑帽運算處理效果如下:

以上就是Python OpenCV形態(tài)學運算示例詳解的詳細內(nèi)容,更多關于Python OpenCV形態(tài)學運算的資料請關注腳本之家其它相關文章!
相關文章
python生成requirements.txt文件的兩種方法
requirements.txt 文件是項目的依賴包及其對應版本號的信息列表,本文主要介紹了python生成requirements.txt文件的兩種方法,具有一定的參考價值,感興趣的可以了解一下2023-12-12
Python的collections模塊中namedtuple結構使用示例
namedtuple顧名思義,就是名字+元組的數(shù)據(jù)結構,下面就來看一下Python的collections模塊中namedtuple結構使用示例2016-07-07
python實現(xiàn)數(shù)據(jù)清洗(缺失值與異常值處理)
今天小編就為大家分享一篇python實現(xiàn)數(shù)據(jù)清洗(缺失值與異常值處理),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-12-12

