cv::MorphologyEx
开放(Opening)
开放只是侵蚀然后扩张的另一个名称。它对于消除噪音很有用。例:
cv::morphologyEx(img, img, MORPH_OPEN, getStructuringElement(MORPH_RECT, Size(9,9)));效果如下
原图 效果图
关闭(Closing)
关闭与开放相反,是膨胀然后侵蚀的另一个名称。对付图内部的小孔或小黑点时很有用。例:
cv::morphologyEx(img, img, MORPH_CLOSE, getStructuringElement(MORPH_RECT, Size(9,9)));效果如下
原图 效果图
形态梯度(Morphological Gradient)
这是图像的膨胀和腐蚀之间的相减。结果将看起来像对象的轮廓。
例:
cv::morphologyEx(img, img, MORPH_GRADIENT, getStructuringElement(MORPH_RECT, Size(9,9)));效果如下
原图 效果图
高顶帽(Top Hat)
这是输入图像和图像开放后之间的区别。下面的示例针对9x9内核完成。例:
cv::morphologyEx(img, img, MORPH_TOPHAT, getStructuringElement(MORPH_RECT, Size(9,9)));效果如下
原图 效果图
黑帽(Black Hat) 这是输入图像和输入图像关闭后之间的差异。
例:
cv::morphologyEx(img, img, MORPH_BLACKHAT, getStructuringElement(MORPH_RECT, Size(9,9)));效果如下
原图 效果图
结构元素
结构元素除了最基本的长方形以外,还有圆形和叉形的,可以根据所需选择使用。以下使用的是OpenCV Python接口,以方便了解getStructingElement所能给出的核心形状。# Rectangular Kernel >>> cv2.getStructuringElement(cv2.MORPH_RECT,(5,5)) array([[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], dtype=uint8) # Elliptical Kernel >>> cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5)) array([[0, 0, 1, 0, 0], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [0, 0, 1, 0, 0]], dtype=uint8) # Cross-shaped Kernel >>> cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5)) array([[0, 0, 1, 0, 0], [0, 0, 1, 0, 0], [1, 1, 1, 1, 1], [0, 0, 1, 0, 0], [0, 0, 1, 0, 0]], dtype=uint8)从上面可以看到,MORPH_RECT会给出一个长方形的核心,MORPH_ELLIPSE会给出一个(椭)圆的核心,而MORPH_CROSS会给出一个十字形的核心。