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();
}
以下是一些操作的宏定义: