Dce5b939d476282f2b04b50f700a6e7b
Learning OpenCV with iOS: 形态学--开运算、闭运算、梯度、顶帽、黑帽

一、前言

上一篇 我们讲解了OpenCV图像形态学中的膨胀和腐蚀。本篇向大家介绍下其他形态学操作。按惯例,先来看下效果图。

提取水平线

提取水平线

二、开运算

开运算,其实就是先腐蚀后膨胀的过程。开运算可以消除 “白色” 小物体,在纤细点处分离物体,并在平滑较大物体边界的同时不明显改变其面积

OpenCV 提供了便捷的形态学操作API,当参数 op 取 MORPH_OPEN 时,便是开运算操作。

/** 
@param op Type of a morphological operation, see #MorphTypes
@note The number of iterations is the number of times erosion or dilatation operation will be applied.
For instance, an opening operation (#MORPH_OPEN) with two iterations is equivalent to apply
successively: erode -> erode -> dilate -> dilate (and not erode -> dilate -> erode -> dilate).
 */
CV_EXPORTS_W void morphologyEx( InputArray src, OutputArray dst,
                                int op, InputArray kernel,
                                Point anchor = Point(-1,-1), int iterations = 1,
                                int borderType = BORDER_CONSTANT,
                                const Scalar& borderValue = morphologyDefaultBorderValue() );

思考

  • 开运算为何可以消除 “白色” 小物体
    因为开运算,先腐蚀,腐蚀操作将“白色”小物体去除了。

  • 为何在平滑较大物体边界的同时不明显改变其面积
    因为一腐蚀和一膨胀抵消了,所以面积改变得不明显。

“开” 下王者

+ (UIImage *)open:(UIImage *)image sizeX:(int)sizeX sizeY:(int)sizeY {
    Mat src;
    UIImageToMat(image, src);

    Mat dst;
    Mat kernel = getStructuringElement(MORPH_RECT, cv::Size(sizeX, sizeY));
    morphologyEx(src, dst, MORPH_OPEN, kernel);

    UIImage* result = MatToUIImage(dst);

    return result;
}

OpenCV.open(imageView.image, sizeX: sizeX, sizeY: sizeY)

三、闭运算

闭运算,其实就是先膨胀后腐蚀的过程。闭运算可以消除 “黑色” 小物体

当函数 morphologyEx 参数 op 取 MORPH_CLOSE 时,便是闭运算操作。

思考

  • 闭运算为何可以消除 “黑色” 小物体
    因为闭运算,先膨胀,膨胀操作将“黑色”小物体去除了。

“闭” 掉王者碎末

+ (UIImage *)close:(UIImage *)image sizeX:(int)sizeX sizeY:(int)sizeY {
    Mat src;
    UIImageToMat(image, src);

    Mat dst;
    Mat kernel = getStructuringElement(MORPH_RECT, cv::Size(sizeX, sizeY));
    morphologyEx(src, dst, MORPH_CLOSE, kernel);

    UIImage* result = MatToUIImage(dst);

    return result;
}

OpenCV.close(imageView.image, sizeX: sizeX, sizeY: sizeY)

四、形态学梯度

形态学梯度是膨胀图与腐蚀图之差,对二值图可以将团块边缘凸显出来,可以用其来保留边缘轮廓

当函数 morphologyEx 参数 op 取 MORPH_GRADIENT 时,便是形态学梯度操作。

王者梯度

```swift

  • (UIImage *)gradient:(UIImage *)image sizeX:(int)sizeX sizeY:(int)sizeY {
    Mat src;
    UIImageToMat(image, src);

    Mat dst;
    Mat kernel = getStructuringElement(MORPH_RECT, cv::Size(sizeX, sizeY));
    morphologyEx(src, dst, MORPH_GRADIENT, kernel);

top Created with Sketch.