1. 程式人生 > >形態學:擊中、不擊中

形態學:擊中、不擊中

原理

  • 作用:在二值影象中找到匹配

  • 公式: A B = ( A

    B 1 ) ( A c
    B 2 ) A⊛B=(A⊖B1)∩(A^c⊖B2)

  1. 用 kernel B 1
    B1
    腐蝕A
  2. 用 kernel B 2 B2 腐蝕A的補集
  3. 求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

  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 = 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     //插值方法(本實驗使用的是最近鄰域插值,其他方法
    )