OpenCV Hit-or-Miss

2018-09-01 14:04 更新

目標(biāo)

在本教程中,您將學(xué)習(xí)如何使用Hit-or-Miss變換(也稱為Hit-and-Miss變換)來查找二進制圖像中的給定配置或模式。這種變換也是更先進的形態(tài)學(xué)操作如稀釋或修剪的基礎(chǔ)。

我們將使用OpenCV函數(shù)cv :: morphologyEx

Hit-or-Miss理論

形態(tài)運算符根據(jù)其形狀來處理圖像。這些操作者將一個或多個結(jié)構(gòu)元素應(yīng)用于輸入圖像以獲得輸出圖像。兩種基本形態(tài)作用是侵蝕和擴張。這兩個操作的組合產(chǎn)生了先進的形態(tài)變換,如打開,關(guān)閉或頂帽變換。要了解更多關(guān)于這些和其他基本形態(tài)操作,請參閱此處此處的以前的教程。

Hit-or-Miss轉(zhuǎn)換對于查找二進制圖像中的圖案非常有用。特別地,它找到其鄰域與第一結(jié)構(gòu)元素的形狀匹配的那些像素,同時不匹配第二結(jié)構(gòu)元素B_2的形狀。在數(shù)學(xué)上,應(yīng)用于圖像A的操作可以表示如下:B1B2A

OpenCV Hit-or-Miss

因此,命中或錯過操作包括三個步驟:

  1. 侵蝕圖像與結(jié)構(gòu)元素B_1。AB1
  2. 用構(gòu)造元素B_2打印圖像(A ^ c)的補碼。AAcB2
  3. AND來自步驟1和步驟2。

結(jié)構(gòu)元素和B_2可以組合成一個單一的元件乙。我們來看一個例子:B1B2B

OpenCV Hit-or-Miss

結(jié)構(gòu)元素(內(nèi)核)。左:內(nèi)核到'打'。中間:內(nèi)核到'miss'。右:最終組合內(nèi)核

在這種情況下,我們正在尋找中心像素屬于背景的圖案,而北,南,東,西像素屬于前景。鄰里的其他像素可以是任何形式,我們不關(guān)心它們?,F(xiàn)在我們把這個內(nèi)核應(yīng)用到輸入圖像中:

OpenCV Hit-or-Miss

輸入二進制圖像

OpenCV Hit-or-Miss

輸出二進制圖像

您可以看到該圖案僅在圖像中的一個位置中找到。

Code

與前面的例子相對應(yīng)的代碼如下所示。您也可以從這里下載

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
int main(){
    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, 0,
        1, -1, 1,
        0, 1, 0);
    Mat output_image;
    morphologyEx(input_image, output_image, MORPH_HITMISS, kernel);
    const int rate = 10;
    kernel = (kernel + 1) * 127;
    kernel.convertTo(kernel, CV_8U);
    resize(kernel, kernel, Size(), rate, rate, INTER_NEAREST);
    imshow("kernel", kernel);
    resize(input_image, input_image, Size(), rate, rate, INTER_NEAREST);
    imshow("Original", input_image);
    resize(output_image, output_image, Size(), rate, rate, INTER_NEAREST);
    imshow("Hit or Miss", output_image);
    waitKey(0);
    return 0;
}

可以看到,它與使用函數(shù)cv :: morphologyEx一樣簡單,操作類型為cv :: MORPH_HITMISS和所選內(nèi)核。

其他例子

在這里,您可以找到將不同內(nèi)核應(yīng)用于之前使用的相同輸入圖像的輸出結(jié)果:

OpenCV Hit-or-Miss

查找右上角的內(nèi)核和輸出結(jié)果

OpenCV Hit-or-Miss

找到左端點的內(nèi)核和輸出結(jié)果

現(xiàn)在嘗試你自己的模式!

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號