OpenCV 中 getStructuringElement() 與 morphologyEx() 函數用法


getStructuringElement() 與 morphologyEx() 兩個函數使用時,經常是放在一起的,后者函數中用到的參數是由前者提供

  • cv2.getStructuringElement()
    • 返回一個特定大小與形狀的結構元素用於形態學操作,生成的結構學元素進一步傳入 Opencv 的 erode、dilate、morphologyEx 函數中完成形態學操作,除此之外,也可以自己構建一個任意形狀的二進制掩碼,作為結構元素

參數詳講

  • shape: 元素形狀,OpenCV 中提供了三種,MORPH_RECT(矩陣)MORPH_CORSS(交叉形狀)MORPH_ELLIPSE(橢圓)
  • ksize ,結構元素的大小;
  • anchor,元素內的描點位置,默認為 (-1,-1)表示形狀中心;值得注意的時,只有 MORPH-CROSS 形狀依賴 描點位置,其它情況 描點僅調節其他形態運算結果偏移了多少

使用命令

retval	=	cv.getStructuringElement(	shape, ksize[, anchor]	)

morphologyEx()

語法命令

dst	=cv.morphologyEx(src, op, kernel[, dst[, anchor[, iterations[, borderType[, borderValue]]]]]	)

對圖像進行形態學轉換;利用最基本腐蝕、膨脹形態學操作;所有操作可直接在源圖像上實現,針對多通道圖像,其中每個通道都是獨立處理,這個方法常用來提取圖像中某類不規則形狀的區域

參數解析

  • src ,預處理的圖像;
  • op ,形態操作的類型,可選擇下面列表中的一種類型,一般參數多選為 cv2.MORPH_CLOSE
  • Snipaste_2020-12-12_17-42-36.jpg
  • kernel: 結構元素,來自於 getStructuringElement 方法

針對上面這兩種方法的用法,這里給一個例子,提取下方圖片中水印部分,也就是中間黑色圓環,和下方字體

shuiyin.jpg

例子代碼用到的代碼如下

import cv2
import numpy as np

if __name__ =='__main__':
    img_path = "F:/Data/Ceshi1/shuiyin.jpg"
    im = cv2.imread(img_path)

    gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)

    background = gray.copy()
    for i in range(1,5):
        kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(2*i+1,2*i+1))
        # print('kernel size is ',kernel)
        background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel)
        background = cv2.morphologyEx(background,cv2.MORPH_CLOSE,kernel)

    cv2.namedWindow('diff',cv2.WINDOW_FREERATIO) # 獲取圖像中前景背景之差
    cv2.imshow('diff',background)

代碼中用了一個 for 循環,用來控制提取圖像不規則形狀的次數,可以根據結果確定一個比較好的值,最終實驗證明了 4 為最合適的

最終提取結果如下

4次.jpg


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM