原理
-
作用:在二值图像中找到匹配
-
公式:
- 用 kernel 腐蚀A
- 用 kernel 腐蚀A的补集
- 求1和2所得结果的交集
- 解释:比如kernel B1 B2如下左中,目的找到匹配B1,但是不匹配B2的区域,B1和B2也可以直接由B(右)表示。目的找到中间是0,上下左右是1的区域,至于四个角(I don’t care)。
举例:
输入图像:
输出图像:找到一个匹配,中心已经标出
代码
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(void)
{
Mat input_image=(Mat_<uchar>(8,8)<<
0, 0, 0, 0, 0, 0, 0, 0,
0, 255, 255, 255, 0, 0, 0, 255,
0, 255, 255, 255, 0, 0, 0, 0,
0, 255, 255, 255, 0, 255, 0, 0,
0, 0, 255, 0, 0, 0, 0, 0,
0, 0, 255, 0, 0, 255, 255, 0,
0, 255, 0, 255, 0, 0, 255, 0,
0, 255, 255, 255, 0, 0, 0, 0);
Mat kernel = (Mat_<int>(3,3)<< 0,-1,-1,
1,1,-1,
0,1, 0);
Mat output_image;
cv::morphologyEx(input_image,output_image,cv::MORPH_HITMISS,kernel);
const int rate=50; //为了显示,进行缩放的比例,放大50倍
kernel =(kernel+1)*127;//将kernel转成0-255, -1:0 0:127 1:255
kernel.convertTo(kernel,CV_8U);
resize(kernel,kernel,Size(),rate,rate,cv::INTER_NEAREST);//下面三步都一样,将图像扩大50倍,方便观察
imshow("kernel",kernel);
cv::moveWindow("kernel",0,0);
resize(input_image,input_image,Size(),rate,rate,INTER_NEAREST);
imshow("Original",input_image);
moveWindow("Original",0,200);
resize(output_image,output_image,Size(),rate,rate,INTER_NEAREST);
imshow("Hit Or Miss",output_image);
moveWindow("Hit Or Miss",500,200);
waitKey(0);
return 0;
};
结果:找到2个匹配
官方API
- void cv::morphologyEx (
InputArray src, //输入图像
OutputArray dst, //输出图像
int op, //选择MORPH_HITMISS
InputArray kernel, //核
Point anchor = Point(-1,-1), //(默认)
int iterations = 1, //(默认)
int borderType = BORDER_CONSTANT, //(默认)
const Scalar & borderValue = morphologyDefaultBorderValue() //(默认)
)
将图像进行缩放
- void cv::resize (
InputArray src, //输入图像
OutputArray dst, //输出图像,它输出大小是dsize(如果dsize不为0);或者由src.size()和fx、fy算出来
Size dsize, //输出图像的大小,如果是0,由下面参数计算
double fx = 0, //缩放比例,输出水平:fx*src.cols
double fy = 0, //缩放比例,输出垂直:fy*src.rows
int interpolation = INTER_LINEAR //插值方法(本实验使用的是最近邻域插值,其他方法)
)