溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

OpenCV-Python怎么實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù)

發(fā)布時(shí)間:2021-06-11 13:49:36 來源:億速云 閱讀:125 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細(xì)講解有關(guān)OpenCV-Python怎么實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù),小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。

通用形態(tài)學(xué)函數(shù)

,我們介紹了形態(tài)學(xué)的基礎(chǔ)腐蝕與膨脹操作,而將腐蝕與膨脹結(jié)合起來進(jìn)行組合,我們就能實(shí)現(xiàn)開運(yùn)算,閉運(yùn)算等復(fù)雜的形態(tài)學(xué)運(yùn)算。

在OpenCV中,它給我們提供的通用形態(tài)學(xué)函數(shù)為cv2.morphologyEx(),其完整定義如下:

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

這些參數(shù)基本前面都介紹過,不過有一點(diǎn)需要說明,src原始圖像必須是CV_8U,CV_16U,CV_16S,CV_32F,CV_64F中的一種。

當(dāng)然,這里面還有一個(gè)陌生的參數(shù)就是op,它就是各種形態(tài)學(xué)的類別,具體類別如表所示:

類型說明意義操作
cv2.MORPH_ERODE腐蝕腐蝕erode()
cv2.MORPH_DILATE膨脹膨脹dilate()
cv2.MORPH_OPEN開運(yùn)算先腐蝕后膨脹dilate(erode())
cv2.MORPH_CLOSE閉運(yùn)算先膨脹后腐蝕erode(dilate())
cv2.MORPH_GRADIENT形態(tài)學(xué)梯度運(yùn)算膨脹圖減腐蝕圖dilate()-erode()
cv2.MORPH_TOPHAT頂帽運(yùn)算原始圖像減開運(yùn)算所得圖像src-open()
cv2.MORPH_BLACKHAT黑帽運(yùn)算閉運(yùn)算所得圖像減原始圖像close()-src
cv2.MORPH_HITMISS擊中擊不中前景背景腐蝕運(yùn)算的交集。僅僅支持CV8UC1二進(jìn)制圖像intersection(erode(src),erode(src1))

開運(yùn)算

如上表所示,開運(yùn)算是將原圖像腐蝕,再對(duì)其進(jìn)行膨脹操作。主要用于去噪,計(jì)數(shù)等。去噪我們已經(jīng)通過上面的腐蝕操作就可以完成,下面我們來實(shí)現(xiàn)有趣的計(jì)數(shù)操作。

import cv2
import numpy as np

img = cv2.imread("open.jpg",cv2.IMREAD_UNCHANGED)
kernel = np.ones((9,9), np.float32)
result = cv2.morphologyEx(img,cv2.MORPH_OPEN,kernel,iterations=5)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,我們能將不同區(qū)域劃分開來,效果如下:

OpenCV-Python怎么實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù)

閉運(yùn)算

閉運(yùn)算是先膨脹后腐蝕的運(yùn)算,它有助于關(guān)閉前景物體內(nèi)部的小孔,或去除物體上的小黑點(diǎn),還可以將不同的前景圖像進(jìn)行連接。下面,我們就將上圖進(jìn)行連接。

import cv2
import numpy as np

img = cv2.imread("close.jpg", cv2.IMREAD_UNCHANGED)
kernel = np.ones((10, 10), np.float32)
result = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=7)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,兩個(gè)方塊就連接為一個(gè)整體了,效果如下所示:

OpenCV-Python怎么實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù)

形態(tài)學(xué)梯度運(yùn)算

形態(tài)學(xué)梯度運(yùn)算是用圖像膨脹后的圖像減去腐蝕圖像的運(yùn)算,該操作可以獲取原始圖像中的前景圖像的邊緣。我們還是用上篇膨脹的圖來測(cè)試,代碼如下:

import cv2
import numpy as np

img = cv2.imread("8.jpg", cv2.IMREAD_UNCHANGED)
kernel = np.ones((5, 5), np.float32)
result = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel,iterations=2)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,我們的圖像就中空了,效果如下:

OpenCV-Python怎么實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù)

頂帽運(yùn)算

頂帽運(yùn)算是用原始圖像減去其開運(yùn)算圖像的操作。它能夠獲取圖像的噪聲信息,或者得到比原圖像的邊緣更亮的邊緣信息。也就是獲取上圖中的白色線條,具體代碼如下:

import cv2
import numpy as np

img = cv2.imread("8.jpg", cv2.IMREAD_UNCHANGED)
kernel = np.ones((5, 5), np.float32)
result = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel,iterations=2)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,效果如下:

OpenCV-Python怎么實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù)

黑帽運(yùn)算

黑帽運(yùn)算是用閉運(yùn)算圖像減去原始圖像的操作。它能夠獲取內(nèi)部的小孔,或前景色中的小黑點(diǎn),亦或者得到比原始圖像的邊緣更暗的邊緣部分。這里,我們用前面的人物圖像,代碼如下:

import cv2
import numpy as np

img = cv2.imread("4.jpg", cv2.IMREAD_UNCHANGED)
kernel = np.ones((5, 5), np.float32)
result = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel,iterations=2)
cv2.imshow("img", img)
cv2.imshow("result", result)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,效果如下:

OpenCV-Python怎么實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù)

結(jié)構(gòu)元函數(shù)

前面我們介紹過,結(jié)構(gòu)元可以自定義,也可以通過cv2.getStructuringElement()函數(shù)生成。這里,我們來看看其完整的定義:

def getStructuringElement(shape, ksize, anchor=None):

shape:形狀類型,取值如下表:

類型意義
cv2.MORPH_RECT矩形結(jié)構(gòu)元,所有元素值為1
cv2.MORPH_CROSS十字形結(jié)構(gòu)元,對(duì)角線元素值為1
cv2.MORPH_ELLIPSE橢圓形結(jié)構(gòu)元素

ksize:結(jié)構(gòu)元的大小

anchor:結(jié)構(gòu)元的錨點(diǎn)位置,默認(rèn)值(-1,1),是形狀的中心。只有十字星型的形狀與錨點(diǎn)位置緊密聯(lián)系。在其他情況下,錨點(diǎn)位置僅用于形態(tài)學(xué)運(yùn)算結(jié)果的調(diào)整。

下面,我們將這三種形狀類型都實(shí)現(xiàn)一遍,具體代碼如下:

import cv2

img = cv2.imread("open.jpg", cv2.IMREAD_UNCHANGED)
kernel1 = cv2.getStructuringElement(cv2.MORPH_RECT,(50,50))
kernel2 = cv2.getStructuringElement(cv2.MORPH_CROSS,(50,50))
kernel3 = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(50,50))
result1 = cv2.dilate(img,kernel1)
result2 = cv2.dilate(img,kernel2)
result3 = cv2.dilate(img,kernel3)
cv2.imshow("img", img)
cv2.imshow("result1", result1)
cv2.imshow("result2", result2)
cv2.imshow("result3", result3)
cv2.waitKey()
cv2.destroyAllWindows()

運(yùn)行之后,效果如下所示:

OpenCV-Python怎么實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù)

關(guān)于“OpenCV-Python怎么實(shí)現(xiàn)通用形態(tài)學(xué)函數(shù)”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI