形态学(击中、不击中)

原理

  • 作用:在二值图像中找到匹配
  • 公式: A ? B = ( A ? B 1 ) ∩ ( A c ? B 2 ) A?B=(A?B1)∩(A^c?B2) A?B=(A?B1)∩(Ac?B2)
  1. 用 kernelB 1 B1 B1 腐蚀A
  2. 用 kernelB 2 B2 B2 腐蚀A的补集
  3. 求1和2所得结果的交集
  • 解释:比如kernel B1 B2如下左中,目的找到匹配B1,但是不匹配B2的区域,B1和B2也可以直接由B(右)表示。目的找到中间是0,上下左右是1的区域,至于四个角(I don’t care)。
    形态学(击中、不击中)
    文章图片
举例:
输入图像:
形态学(击中、不击中)
文章图片

输出图像:找到一个匹配,中心已经标出
形态学(击中、不击中)
文章图片


代码
#include #include using namespace cv; using namespace std; int main(void) { Mat input_image=(Mat_(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_(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:00:1271: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
  1. 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 = https://www.it610.com/article/morphologyDefaultBorderValue() ????//(默认)
    )


将图像进行缩放
  1. 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 ????//插值方法(本实验使用的是最近邻域插值,其他方法)
    )

    推荐阅读