1. 程式人生 > >【opencv入門之七】形態學圖像處理(一):膨脹、腐蝕

【opencv入門之七】形態學圖像處理(一):膨脹、腐蝕

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),     // 錨點的位置 int
iterations=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入門之七】形態學圖像處理(一):膨脹、腐蝕