OpenCV for Android (5)——腐蚀、膨胀、开闭操作

1. 形态学操作

形态学操作就是基于形状的一系列图像处理操作。通过将结构元素作用于输入图像来产生输出图像。最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。他们的运用广泛:

  • 消除噪声
  • 分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
  • 寻找图像中的明显的极大值区域或极小值区域。

而开闭操作其实就是腐蚀与膨胀操作的结合。开操作是先腐蚀、后膨胀处理;闭操作是先膨胀、后腐蚀处理。

腐蚀和膨胀是针对白色部分(高亮部分)而言的。

2. 膨胀

此操作是将图像A与任意形状(通常为正方形或圆形)的内核B,,进行卷积。

内核B有一个可定义的 锚点, 通常定义为内核中心点。

进行膨胀操作时,将内核B划过图像,将内核B覆盖区域的最大相素值提取,并代替锚点位置的相素。显然,这一最大化操作将会导致图像中的亮区开始”扩展” (因此有了术语膨胀 dilation )。对上图采用膨胀操作我们得到:背景(白色)膨胀,而黑色字母缩小了。

3. 腐蚀

腐蚀在形态学操作家族里是膨胀操作的孪生姐妹。它提取的是内核覆盖下的相素最小值。

进行腐蚀操作时,将内核B划过图像,将内核B覆盖区域的最小相素值提取,并代替锚点位置的相素。

以与膨胀相同的图像作为样本,我们使用腐蚀操作。从下面的结果图我们看到亮区(背景)变细,而黑色区域(字母)则变大了。

 public static void erodeOrDilate(String command, Bitmap bitmap) {
        Boolean isErode = OpenCVConstants.ERODE_NAME.equals(command);
        org.opencv.android.Utils.bitmapToMat(bitmap, sSrc);
        Mat strElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,
                new Size(3, 3), new Point(-1, -1));
        if (isErode) {
            Imgproc.erode(sSrc, sDst, strElement, new Point(-1, -1), 3);
        } else {
            Imgproc.dilate(sSrc, sDst, strElement, new Point(-1, -1), 3);
        }
        org.opencv.android.Utils.matToBitmap(sDst, bitmap);
        strElement.release();
        sSrc.release();
        sDst.release();
    }

腐蚀和膨胀的几个参数:

  • 装载图像 (可以是 RGB图像或者灰度图 )
  • src: 原图像
  • dst: 输出图像
  • element: 操作的内核。
  • Point: 锚点
  • Border_Type

其中操作的内核为:
Mat strElement = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,
new Size(3, 3), new Point(-1, -1));

其中有三种内核形状可以选择:

  • 矩形: MORPH_RECT
  • 交叉形: MORPH_CROSS
  • 椭圆形: MORPH_ELLIPSE

再指定内核大小,以及锚点位置。不指定锚点位置,则默认锚点在内核中心位置。

Border_Type Figure
BORDER_DEFAULT 4
BORDER_ISOLATED 16
BORDER_REFLECT 2
BORDER_REFLECT_101 4
BORDER_REFLECT101 4
BORDER_REPLICATE 1
BORDER_TRANSPARENT 5
BORDER_WRAP 3

4. 开闭操作

public static void openOrClose(String command, Bitmap bitmap) {
        Boolean isOpen = OpenCVConstants.OPEN_OPERATION_NAME.equals(command);
        org.opencv.android.Utils.bitmapToMat(bitmap, sSrc);
        sStrElement = Imgproc.getStructuringElement(Imgproc.MORPH_CROSS,
                new Size(3, 3), new Point(-1, -1));
        if (isOpen) {
            Imgproc.morphologyEx(sSrc, sDst, Imgproc.MORPH_OPEN, sStrElement);
        } else {
            Imgproc.morphologyEx(sSrc, sDst, Imgproc.MORPH_CLOSE, sStrElement);
        }
        org.opencv.android.Utils.matToBitmap(sDst, bitmap);
        sStrElement.release();
        sSrc.release();
        sDst.release();
    }

以下是一些操作的宏定义:


参考并感谢

  1. 腐蚀与膨胀(Eroding and Dilating)
  2. OpenCV探索之路(四):膨胀、腐蚀、开闭运算

你可能感兴趣的:(OpenCV)