OpenCV4入门系列教程33:击中和击不中

索引地址:系列教程索引地址

上一篇:OpenCV4入门系列教程32:图像梯度

Hit-miss算法步骤:

击中击不中变换是形态学中用来检测特定形状所处位置的一个基本工具。它的原理就是使用腐蚀;如果要在一幅图像A上找到B形状的目标,我们要做的是:

  • 首先,建立一个比B大的模板W;使用此模板对图像A进行腐蚀,得到图像假设为Process1;
  • 其次,用B减去W,从而得到V模板(W-B);使用V模板对图像A的补集进行腐蚀,得到图像假设为Process2;
  • 然后,Process1与Process2取交集;得到的结果就是B的位置。这里的位置可能不是B的中心位置,要视W-B时对齐的位置而异;

其实很简单,两次腐蚀,然后交集,结果就出来了。以后模版匹配,特征检测都会用,更深入的是,他会加深对膨胀腐蚀的理解,是一个很好的例子。

数学公式如下:

AB=(AΘE)(AcΘF)A*B=(A\Theta E)\bigcap (A^c\Theta F)

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
Mat dresult, eresult;
Mat src = imread("1.jpg");

// 二值化图片
Mat gray, binary, result;
cvtColor(src, gray, COLOR_BGR2GRAY);
threshold(gray, binary, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);
imshow("binary", binary);

// 击中算法部分
Mat se = getStructuringElement(MORPH_CROSS, Size(11, 11), Point(-1, -1));
// 击中击不中
morphologyEx(binary, result, MORPH_HITMISS, se);

imshow("hit-and-miss demo", result);
waitKey(0);
return 0;
}

效果如下:

hitmiss

下一篇:OpenCV4入门系列教程测试4:简单文字切割