OpenCV更多形態(tài)轉(zhuǎn)化

2018-09-01 11:03 更新

目標(biāo)

在本教程中,您將學(xué)習(xí)如何:

  • 使用OpenCV函數(shù)cv :: morphologyEx應(yīng)用形態(tài)轉(zhuǎn)換,如:
  1. 開盤
  2. 閉幕
  3. 形態(tài)梯度
  4. 頂帽
  5. 黑帽

理論

注意
下面的解釋屬于Bradski和Kaehler 的“ 學(xué)習(xí)OpenCV ”一書。

在前面的教程中,我們介紹了兩種基本的形態(tài)學(xué)操作:

  • 侵蝕
  • 擴(kuò)張。

基于這兩個(gè),我們可以對(duì)我們的圖像進(jìn)行更復(fù)雜的轉(zhuǎn)換。在這里,我們簡(jiǎn)要討論OpenCV提供的5個(gè)操作:

開盤

  • 它是通過圖像的侵蝕獲得的,隨后是擴(kuò)張。

OpenCV更多形態(tài)轉(zhuǎn)化

  • 用于去除小物體(假設(shè)物體在黑暗的前景上是明亮的)
  • 例如,請(qǐng)查看下面的示例。左側(cè)的圖像是原始圖像,右側(cè)的圖像是應(yīng)用打開轉(zhuǎn)換后的結(jié)果。我們可以觀察到,信中角落的小空間往往會(huì)消失。

OpenCV更多形態(tài)轉(zhuǎn)化

為了清楚起見,我們7x7在相同的原始圖像上執(zhí)行了打開操作(矩形結(jié)構(gòu)元素),但是反轉(zhuǎn),例如白色的對(duì)象現(xiàn)在是字母。

OpenCV更多形態(tài)轉(zhuǎn)化

左圖:原圖反轉(zhuǎn),右圖:打開

閉幕

  • 它是通過圖像的擴(kuò)張,然后是侵蝕獲得的。

OpenCV更多形態(tài)轉(zhuǎn)化

  • 有用的是去除小孔(暗區(qū))。

OpenCV更多形態(tài)轉(zhuǎn)化

在倒置圖像上,我們執(zhí)行了關(guān)閉操作(7x7矩形結(jié)構(gòu)元素):

OpenCV更多形態(tài)轉(zhuǎn)化

左圖:原圖反轉(zhuǎn),右圖:結(jié)果關(guān)閉

形態(tài)梯度

  • 這是圖像的擴(kuò)張和侵蝕的區(qū)別。

OpenCV更多形態(tài)轉(zhuǎn)化

  • 找到對(duì)象的輪廓是有用的,如下所示:

OpenCV更多形態(tài)轉(zhuǎn)化

頂帽

  • 輸入圖像與其打開之間的區(qū)別。

OpenCV更多形態(tài)轉(zhuǎn)化

OpenCV更多形態(tài)轉(zhuǎn)化

黑帽

  • 這是關(guān)閉和輸入圖像之間的區(qū)別

OpenCV更多形態(tài)轉(zhuǎn)化

OpenCV更多形態(tài)轉(zhuǎn)化

Code

本教程代碼如下所示。您也可以從這里下載


#include "opencv2/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
Mat src, dst;
int morph_elem = 0;
int morph_size = 0;
int morph_operator = 0;
int const max_operator = 4;
int const max_elem = 2;
int const max_kernel_size = 21;
const char* window_name = "Morphology Transformations Demo";
void Morphology_Operations( int, void* );
int main( int argc, char** argv )
{
  String imageName("../data/baboon.jpg"); // by default
  if (argc > 1)
  {
  imageName = argv[1];
  }
  src = imread(imageName, IMREAD_COLOR); // Load an image
  if( src.empty() )
    { return -1; }
  namedWindow( window_name, WINDOW_AUTOSIZE ); // Create window
  createTrackbar("Operator:\n 0: Opening - 1: Closing  \n 2: Gradient - 3: Top Hat \n 4: Black Hat", window_name, &morph_operator, max_operator, Morphology_Operations );
  createTrackbar( "Element:\n 0: Rect - 1: Cross - 2: Ellipse", window_name,
                  &morph_elem, max_elem,
                  Morphology_Operations );
  createTrackbar( "Kernel size:\n 2n +1", window_name,
                  &morph_size, max_kernel_size,
                  Morphology_Operations );
  Morphology_Operations( 0, 0 );
  waitKey(0);
  return 0;
}
void Morphology_Operations( int, void* )
{
  // Since MORPH_X : 2,3,4,5 and 6
  int operation = morph_operator + 2;
  Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );
  morphologyEx( src, dst, operation, element );
  imshow( window_name, dst );
}

說明

  1. 我們來看一下程序的一般結(jié)構(gòu):
  • 加載圖像
  • 創(chuàng)建一個(gè)窗口以顯示形態(tài)操作的結(jié)果
  • 創(chuàng)建三個(gè)Trackbars供用戶輸入?yún)?shù):

第一個(gè)跟蹤欄操作返回要使用的形態(tài)學(xué)操作(morph_operator)。

  createTrackbar(“Operator:\ n 0:Opening  -  1:Closing \ n 2:Gradient  -  3:Top Hat \ n 4:Black Hat”,window_name,&morph_operator,max_operator,Morphology_Operations);

第二個(gè)trackbar 元素返回morph_elem,它表示我們的內(nèi)核是什么樣的結(jié)構(gòu):

  createTrackbar( "Element:\n 0: Rect - 1: Cross - 2: Ellipse", window_name,
                  &morph_elem, max_elem,
                  Morphology_Operations );

最終的trackbar 內(nèi)核大小返回要使用的內(nèi)核的大?。?b>morph_size)

  createTrackbar( "Kernel size:\n 2n +1", window_name,
                  &morph_size, max_kernel_size,
                  Morphology_Operations );
  • 每當(dāng)我們移動(dòng)任何滑塊時(shí),將調(diào)用用戶的功能Morphology_Operations來實(shí)現(xiàn)新的形態(tài)學(xué)操作,并且它將根據(jù)當(dāng)前的跟蹤欄值來更新輸出圖像。
void Morphology_Operations( int, void* )
{
  // Since MORPH_X : 2,3,4,5 and 6
  int operation = morph_operator + 2;
  Mat element = getStructuringElement( morph_elem, Size( 2*morph_size + 1, 2*morph_size+1 ), Point( morph_size, morph_size ) );
  morphologyEx( src, dst, operation, element );
  imshow( window_name, dst );
}

我們可以觀察到進(jìn)行形態(tài)變換的關(guān)鍵功能是cv :: morphologyEx。在這個(gè)例子中,我們使用四個(gè)參數(shù)(其余的作為默認(rèn)值):

  1. src:源(輸入)圖像
  2. dst:輸出圖像
  3. 操作:要進(jìn)行的形態(tài)轉(zhuǎn)化的種類。請(qǐng)注意,我們有5個(gè)選擇:
  • 開幕式:MORPH_OPEN:2
  • 關(guān)閉:MORPH_CLOSE:3
  • 漸變:MORPH_GRADIENT:4
  • 頂帽:MORPH_TOPHAT:5
  • 黑帽子:MORPH_BLACKHAT:6

正如您可以看到的值范圍從<2-6>,這就是為什么我們添加(+2)到軌跡欄輸入的值:

  int operation = morph_operator + 2;

結(jié)果

  • 在編譯上面的代碼之后,我們可以執(zhí)行它,給出一個(gè)圖像路徑作為參數(shù)。對(duì)于本教程,我們使用輸入圖像:baboon.png:

OpenCV更多形態(tài)轉(zhuǎn)化

這里是顯示窗口的兩個(gè)快照。第一張照片顯示了使用操作符打開一個(gè)交叉內(nèi)核后的輸出。第二張照片(右側(cè),顯示了使用帶有橢圓內(nèi)核的Blackhat操作符的結(jié)果。

OpenCV更多形態(tài)轉(zhuǎn)化

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)