W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
在本教程中,您將學(xué)習(xí)如何:
在前面的教程中,我們介紹了兩種基本的形態(tài)學(xué)操作:
基于這兩個(gè),我們可以對(duì)我們的圖像進(jìn)行更復(fù)雜的轉(zhuǎn)換。在這里,我們簡(jiǎn)要討論OpenCV提供的5個(gè)操作:
為了清楚起見,我們7x7在相同的原始圖像上執(zhí)行了打開操作(矩形結(jié)構(gòu)元素),但是反轉(zhuǎn),例如白色的對(duì)象現(xiàn)在是字母。
左圖:原圖反轉(zhuǎn),右圖:打開
在倒置圖像上,我們執(zhí)行了關(guān)閉操作(7x7矩形結(jié)構(gòu)元素):
左圖:原圖反轉(zhuǎn),右圖:結(jié)果關(guān)閉
找到對(duì)象的輪廓是有用的,如下所示:
本教程代碼如下所示。您也可以從這里下載
#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 );
}
第一個(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 );
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)值):
正如您可以看到的值范圍從<2-6>,這就是為什么我們添加(+2)到軌跡欄輸入的值:
int operation = morph_operator + 2;
這里是顯示窗口的兩個(gè)快照。第一張照片顯示了使用操作符打開一個(gè)交叉內(nèi)核后的輸出。第二張照片(右側(cè),顯示了使用帶有橢圓內(nèi)核的Blackhat操作符的結(jié)果。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: