2009年7月14日 星期二

6_8程式

6_8主要是做影像處理的四個基本運算

 

四個運算分別是:腐蝕,膨脹,開運算(先腐蝕再膨脹),閉運算(先膨脹再腐蝕)


  

以下為完整程式碼(附註解)

#include "cxcore.h"

#include "highgui.h"

#include "cv.h"

class CMainFrame

{

IplImage *img;

public:

CMainFrame()

{

img=cvLoadImage("lena.jpg"); //讀圖並存入參數img

}

void OnErosion();

void OnOpen();

};

 

void CMainFrame::OnErosion()

{

IplImage *pImgErode = NULL;

IplImage *pImgDilate = NULL;

 

//將已讀入系統的圖片複製

pImgErode = cvCloneImage(img);

pImgDilate = cvCloneImage(img);

 

//對輸入圖像使用默認的3X3長方型結構元素進行腐蝕(侵蝕)

cvErode(pImgErode,pImgErode,0,5);

/*cvErode(輸入圖像,輸出圖像,element,腐蝕的次數);

element用於腐蝕的結構元素。若為 NULL, 則使用 3×3 長方形的結構元素

*/

 

//對輸入圖像使用默認的3X3長方型結構元素進行腐膨脹(擴張)

cvDilate(pImgDilate,pImgDilate,0,5);

/*cvDilate(輸入圖像,輸出圖像,element,膨脹的次數);

element用於膨脹的結構元素。若為 NULL, 則使用 3×3 長方形的結構元素

*/

 

//建立窗口並顯示圖像

cvNamedWindow("Erosion",0);

cvShowImage("Erosion",pImgErode);

cvNamedWindow("Dilation",0);

cvShowImage("Dilation",pImgDilate);

 

cvWaitKey(0);

 

//將程序開始定義的變量釋放

cvReleaseImage(&pImgErode);

cvReleaseImage(&pImgDilate);

 

//銷毀窗口

cvDestroyWindow("Erosion");

cvDestroyWindow("Dilation");

}


void CMainFrame::OnOpen()

{

IplImage *pImgOpen = NULL;

IplImage *pImgClose = NULL;

IplConvKernel * pKernel = NULL;

 

//將已讀入系統的圖片複製

pImgOpen = cvCloneImage(img);

pImgClose = cvCloneImage(img);

 

//創建結構元素

pKernel = cvCreateStructuringElementEx(15,15,8,8,CV_SHAPE_ELLIPSE,NULL);

/*cvCSEE(結構元素的列數目,結構元素的行數目,錨點的相對水平偏移量,錨點的相對垂直偏移量,結構元素的形狀,指向結構元素的指針)

CV_SHAPE_RECT, 長方形元素;

CV_SHAPE_ELLIPSE, 橢圓元素;

CV_SHAPE_CUSTOM, 用戶自定義元素;

指向結構元素的指針,它是一個平面數組,表示對元素矩陣逐行掃描。

(非零點表示該點屬於結構元)

如果指針為空,則表示平面數組中的所有元素都是非零的,即結構元是一個長方形

(該參數僅僅當shape參數是 CV_SHAPE_CUSTOM 時才予以考慮)

*/

 

//進行開運算(先腐蝕再膨脹)

cvErode(pImgOpen,pImgOpen,pKernel,1);

cvDilate(pImgOpen,pImgOpen,pKernel,1);

 

//進行閉運算(先膨脹再腐蝕)

cvDilate(pImgClose,pImgClose,pKernel,1);

cvErode(pImgClose,pImgClose,pKernel,1);

 

//建立窗口並顯示圖像

cvNamedWindow("Open",0);

cvShowImage("Open",pImgOpen);

cvNamedWindow("Close",0);

cvShowImage("Close",pImgClose);

cvWaitKey(0);

 

//將程序開始定義的變量釋放

cvReleaseImage(&pImgOpen);

cvReleaseImage(&pImgClose);

 

//銷毀窗口

cvDestroyWindow("Open");

cvDestroyWindow("Close");

}

 

int main()

{

CMainFrame CM;

CM.OnErosion();

CM.OnOpen();;

}


所使用過的CV函式:

1.cvCloneImage(輸入圖像)

2.cvErode(輸入圖像,輸出圖像,腐蝕的結構元素,腐蝕的次數)

3.cvDilate(輸入圖像,輸出圖像,膨脹的結構元素,膨脹的次數);

4.cvCreateStructuringElementEx(結構元素的列數目,結構元素的行數目,錨點的相對水平偏移量,錨點的相對垂直偏移量,結構元素的形狀,指向結構元素的指針)


提問:

  1.腐蝕跟膨脹的element如果是NULL,在程式執行中,3x3的結構元素是指以一個點的像素與鄰近的上下左右八個點的像素形成的九宮格嗎?

  2.延續上一點,腐蝕跟膨脹的函式是將九宮格內的所有值如何做運算的?(課本上這邊相當不容易懂,網路上目前還我還查不到詳細的說明)

  3.程式中創建的結構元素pKernel,是使用CV_SHAPE_ELLIPSE橢圓元素,這個對於開運算跟閉運算來講,腐蝕跟膨脹的過程是否即改為使用橢圓的範圍,而不是原來所使用的3x3長方形結構元素?


程式執行心得:

  看懂程式碼似乎已經不是最難的過程,拿到這段程式碼之後,最難下手的地方在於怎麼讓它成功的執行出來,對於使用class還不是很敏感,剛開始執行的時候不懂得使用class來宣告,這次的作業當中,除了進一步與CV了解,另外一個最大的收穫就是了解到一路學習程式到現在,卻不會使用最重要的功能物件

沒有留言:

張貼留言