Fork me on GitHub

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

posted @ 2020-12-12 23:57  zeroing1  阅读(2963)  评论(0编辑  收藏  举报