OpenCV-Python實現通用形態學函數
通用形態學函數
上篇博文,我們介紹瞭形態學的基礎腐蝕與膨脹操作,而將腐蝕與膨脹結合起來進行組合,我們就能實現開運算,閉運算等復雜的形態學運算。
在OpenCV中,它給我們提供的通用形態學函數為cv2.morphologyEx(),其完整定義如下:
def morphologyEx(src, op, kernel, dst=None, anchor=None, iterations=None, borderType=None, borderValue=None):
這些參數基本前面都介紹過,不過有一點需要說明,src原始圖像必須是CV_8U,CV_16U,CV_16S,CV_32F,CV_64F中的一種。
當然,這裡面還有一個陌生的參數就是op,它就是各種形態學的類別,具體類別如表所示:
類型 | 說明 | 意義 | 操作 |
---|---|---|---|
cv2.MORPH_ERODE | 腐蝕 | 腐蝕 | erode() |
cv2.MORPH_DILATE | 膨脹 | 膨脹 | dilate() |
cv2.MORPH_OPEN | 開運算 | 先腐蝕後膨脹 | dilate(erode()) |
cv2.MORPH_CLOSE | 閉運算 | 先膨脹後腐蝕 | erode(dilate()) |
cv2.MORPH_GRADIENT | 形態學梯度運算 | 膨脹圖減腐蝕圖 | dilate()-erode() |
cv2.MORPH_TOPHAT | 頂帽運算 | 原始圖像減開運算所得圖像 | src-open() |
cv2.MORPH_BLACKHAT | 黑帽運算 | 閉運算所得圖像減原始圖像 | close()-src |
cv2.MORPH_HITMISS | 擊中擊不中 | 前景背景腐蝕運算的交集。僅僅支持CV8UC1二進制圖像 | intersection(erode(src),erode(src1)) |
開運算
如上表所示,開運算是將原圖像腐蝕,再對其進行膨脹操作。主要用於去噪,計數等。去噪我們已經通過上面的腐蝕操作就可以完成,下面我們來實現有趣的計數操作。
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()
運行之後,我們能將不同區域劃分開來,效果如下:
閉運算
閉運算是先膨脹後腐蝕的運算,它有助於關閉前景物體內部的小孔,或去除物體上的小黑點,還可以將不同的前景圖像進行連接。下面,我們就將上圖進行連接。
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()
運行之後,兩個方塊就連接為一個整體瞭,效果如下所示:
形態學梯度運算
形態學梯度運算是用圖像膨脹後的圖像減去腐蝕圖像的運算,該操作可以獲取原始圖像中的前景圖像的邊緣。我們還是用上篇膨脹的圖來測試,代碼如下:
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()
運行之後,我們的圖像就中空瞭,效果如下:
頂帽運算
頂帽運算是用原始圖像減去其開運算圖像的操作。它能夠獲取圖像的噪聲信息,或者得到比原圖像的邊緣更亮的邊緣信息。也就是獲取上圖中的白色線條,具體代碼如下:
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()
運行之後,效果如下:
黑帽運算
黑帽運算是用閉運算圖像減去原始圖像的操作。它能夠獲取內部的小孔,或前景色中的小黑點,亦或者得到比原始圖像的邊緣更暗的邊緣部分。這裡,我們用前面的人物圖像,代碼如下:
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()
運行之後,效果如下:
結構元函數
前面我們介紹過,結構元可以自定義,也可以通過cv2.getStructuringElement()函數生成。這裡,我們來看看其完整的定義:
def getStructuringElement(shape, ksize, anchor=None):
shape:形狀類型,取值如下表:
類型 | 意義 |
---|---|
cv2.MORPH_RECT | 矩形結構元,所有元素值為1 |
cv2.MORPH_CROSS | 十字形結構元,對角線元素值為1 |
cv2.MORPH_ELLIPSE | 橢圓形結構元素 |
ksize:結構元的大小
anchor:結構元的錨點位置,默認值(-1,1),是形狀的中心。隻有十字星型的形狀與錨點位置緊密聯系。在其他情況下,錨點位置僅用於形態學運算結果的調整。
下面,我們將這三種形狀類型都實現一遍,具體代碼如下:
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()
運行之後,效果如下所示:
到此這篇關於OpenCV-Python實現通用形態學函數的文章就介紹到這瞭,更多相關OpenCV 通用形態學函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- OpenCV-Python實現腐蝕與膨脹的實例
- Python常用圖像形態學操作詳解
- C++ opencv圖像處理實現圖像腐蝕和膨脹示例
- OpenCV學習之圖像形態學處理詳解
- Python圖像運算之頂帽運算和底帽運算詳解