【opencv入門之七】形態學圖像處理(一):膨脹、腐蝕
阿新 • • 發佈:2017-09-21
tar struct show 函數 使用 運算 腐蝕和膨脹 依賴 版本
參考網站:
http://blog.csdn.net/poem_qianmo/article/details/23710721
1、形態學(morphology)概述
數學形態學(Mathematical morphplogy)是數學形態學圖像處理的基本理論。其基本的運算包括:
二值腐蝕和膨脹、二值開閉運算、骨架抽取、極限腐蝕、擊中擊不中變化、形態學梯度、Top-hat變換、顆粒分析、流域變換、灰值腐蝕和膨脹、灰值開閉運算、灰值形態學梯度等。
最基本的兩種是:腐蝕和膨脹。其兩的主要功能有:
-
- 消除噪聲
- 分割(isolate)出獨立的圖像元素,在圖像中鏈接(join)相鄰的元素
- 尋找圖像中的明顯的極大值區域或極小值區域
- 求出圖像的梯度
腐蝕就是原圖中的高亮部分被腐蝕,膨脹就是原圖中的高亮部分被膨脹。
2、形態學膨脹——dilate函數
void dilate( InputArray src, OutputArray dst, InputArray kernel, //膨脹操作的核。若為NULL時,表示的是使用參考點位於中心3*3的核
一般使用getStructuringElement配合這個參數的使用
Point anchor=Point(-1,-1), // 錨點的位置 intiterations=1, //叠代使用erode()函數的次數 int borderType=BORDER_CONSTANT, const Scalar& borderValue=morphologyDefaultBorderValue() );
getStructuringElement函數:
1 int g_nStructElementSize = 3; //結構元素(內核矩陣)的尺寸 2 3 //獲取自定義核 4 Mat element = getStructuringElement(MORPH_RECT, //表示內核的形狀 5 Size(2*g_nStructElementSize+1,2*g_nStructElementSize+1), //表示內核的尺寸 6 Point( g_nStructElementSize, g_nStructElementSize )); //錨點的位置
其中第一個參數可以選擇:
-
- 矩形:MORPH_RECT
- 交叉形:MORPH_CROSS
- 橢圓形:MORPH_ELLIPSE
一般在調用erode以及dilate函數之前,先定義一個Mat類型的變量來獲取getStructuringElement函數的返回值。調用完這個函數後,就可以接下來調用erode或dilate函數了。
1 //載入原圖 2 Mat image = imread("1.jpg"); 3 //獲取自定義核 4 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 5 Mat out; 6 //進行膨脹操作 7 dilate(image, out, element);
3、形態學腐蝕——erdoe函數:
1 void erode( 2 InputArray src, 3 OutputArray dst, 4 InputArray kernel, 5 Point anchor=Point(-1,-1), 6 int iterations=1, 7 int borderType=BORDER_CONSTANT, 8 const Scalar& borderValue=morphologyDefaultBorderValue() 9 );
1 //載入原圖 2 Mat image = imread("1.jpg"); 3 //獲取自定義核 4 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); 5 Mat out; 6 //進行腐蝕操作 7 erode(image,out, element);
4、綜合實踐:
1 //******************************【程序說明】***************************** 2 // 程序名稱:形態學圖像處理(一):膨脹、腐蝕 3 // opencv版本:2.4.13 4 // 日期:2017/9/21 5 //********************************************************************** 6 7 8 //******************************【頭文件包含部分】***************************** 9 // 描述:包含程序所依賴的頭文件 10 //***************************************************************************** 11 #include <opencv2/core/core.hpp> 12 #include <opencv2/highgui/highgui.hpp> 13 #include <opencv2/imgproc/imgproc.hpp> 14 #include <iostream> 15 16 17 //******************************【命名空間聲明部分】***************************** 18 // 描述:包含程序所使用的命名空間 19 //***************************************************************************** 20 using namespace std; 21 using namespace cv; 22 23 24 //******************************【全局變量聲明部分】***************************** 25 // 描述:全局變量聲明 26 //***************************************************************************** 27 Mat g_srcImage,g_dstImage; //原始圖、效果圖 28 int g_nTrackbarNumer = 0; //0表示腐蝕erode,1表示膨脹dilate 29 int g_nStructElementSize = 3; //結構元素(內核矩陣)的尺寸 30 31 32 //******************************【全局函數聲明部分】***************************** 33 // 描述:全局函數聲明 34 //***************************************************************************** 35 void Process(); //膨脹和腐蝕的處理函數 36 void on_TrackbarNumChange ( int, void* ); //回調函數 37 void on_ElementSizeChange( int, void* ); //回調函數 38 39 40 //******************************【main()部分】***************************** 41 // 描述:控制臺應用程序的入口函數,我們的程序從這裏開始 42 //***************************************************************************** 43 int main() 44 { 45 //【0】初始化 46 system("color 5E"); 47 48 //【1】讀取原圖 49 g_srcImage = imread( "1.jpg", 1 ); 50 if(!g_srcImage.data) { printf("Oh,no,讀取srcImage錯誤!!!!\n"); return false; } 51 52 //【2】顯示原圖 53 namedWindow("【<0>原圖窗口】", 1 ); 54 imshow("【<0>原圖窗口】", g_srcImage ); 55 56 //【3】進行初次腐操作並顯示效果圖 57 namedWindow("【<1>腐蝕/膨脹效果圖】", 1); 58 Process(); 59 60 //【4】創建軌跡條 61 createTrackbar( "腐蝕/膨脹", "【<1>腐蝕/膨脹效果圖】", &g_nTrackbarNumer, 1, on_TrackbarNumChange ); 62 createTrackbar( "內核尺寸", "【<1>腐蝕/膨脹效果圖】", &g_nStructElementSize, 21, on_ElementSizeChange ); 63 64 //【5】輸出一些有幫助的信息 65 cout<<endl<<"\t嗯。好了,請調整滾動條觀察圖像效果~\n\n" 66 <<"\t按下“q”鍵時,程序退出~!\n"; 67 68 //【6】按下“q”鍵時,程序退出 69 while(char(waitKey(1) != ‘q‘)){} 70 71 return 0; 72 } 73 74 75 //******************************【Process()部分】***************************** 76 // 描述:進行自定義的腐蝕和膨脹操作 77 //***************************************************************************** 78 void Process() 79 { 80 //獲取自定義核 81 Mat element = getStructuringElement(MORPH_RECT, 82 Size(2*g_nStructElementSize+1, 2*g_nStructElementSize+1 ), 83 Point( g_nStructElementSize, g_nStructElementSize ) ); 84 //進行腐蝕 或 膨脹操作 85 if(g_nTrackbarNumer == 0) 86 erode(g_srcImage, g_dstImage, element); 87 else 88 dilate(g_srcImage, g_dstImage, element); 89 90 //顯示效果圖 91 imshow("【<1>腐蝕/膨脹效果圖】", g_dstImage); 92 } 93 94 95 //******************************【on_TrackbarNumChange()部分】***************************** 96 // 描述:腐蝕和膨脹之間【切換開關】時的回調函數 97 //***************************************************************************** 98 void on_TrackbarNumChange ( int, void* ) 99 { 100 //腐蝕和膨脹之間效果已經切換,回調函數體內需調用一次Process函數,使改變後的效果立即生效並顯示出來 101 Process(); 102 } 103 104 //******************************【on_ElementSizeChange()部分】***************************** 105 // 描述:腐蝕和膨脹操作【內核改變】時的回調函數 106 //***************************************************************************** 107 void on_ElementSizeChange( int, void* ) 108 { 109 //內核尺寸已改變,回調函數體內需調用一次Process函數,使改變後的效果立即生效並顯示出來 110 Process(); 111 }
【opencv入門之七】形態學圖像處理(一):膨脹、腐蝕