OpenCV4入门教程037:击中和击不中

索引地址:系列索引

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入门教程037:击中和击不中
https://feater.top/opencv/opencv-hit-or-not-hit/
作者
JackeyLea
发布于
2020年6月9日
许可协议