OpenCV 中 getStructuringElement() 与 morphologyEx() 函数用法
getStructuringElement() 与 morphologyEx() 两个函数使用时,经常是放在一起的,后者函数中用到的参数是由前者提供
- cv2.getStructuringElement()
- 返回一个特定大小与形状的结构元素用于形态学操作,生成的结构学元素进一步传入 Opencv 的
erode、dilate、morphologyEx
函数中完成形态学操作,除此之外,也可以自己构建一个任意形状的二进制掩码,作为结构元素
- 返回一个特定大小与形状的结构元素用于形态学操作,生成的结构学元素进一步传入 Opencv 的
参数详讲
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
kernel
: 结构元素,来自于getStructuringElement
方法
针对上面这两种方法的用法,这里给一个例子,提取下方图片中水印部分,也就是中间黑色圆环,和下方字体
例子代码用到的代码如下
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
为最合适的
最终提取结果如下