腐蝕膨脹是影象形態學比較常見的處理,腐蝕一般可以用來消除噪點,分割出獨立的影象元素等。
一般腐蝕操作對二值圖進行處理,腐蝕操作如下圖,中心位置的畫素點是否與周圍領域的畫素點顏色一樣(即是否是白色點,即值是否為255),若一致,則保留,不一致則該點變為黑色(值即為0)
opencv中的腐蝕操作:
1 2 3 |
CVAPI(void) cvErode( const CvArr* src, CvArr* dst, IplConvKernel* element CV_DEFAULT(NULL), int iterations CV_DEFAULT(1) ); |
前兩個引數比較熟悉,第三個引數是用於傳遞模板的資訊,預設是(NULL),即為3*3的模板,第四個引數是迭代的次數(即該腐蝕操作做幾次)
opencv中的膨脹操作其實就是腐蝕的反操作:
1 2 3 |
CVAPI(void) cvDilate( const CvArr* src, CvArr* dst, IplConvKernel* element CV_DEFAULT(NULL), int iterations CV_DEFAULT(1) ); |
測試程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#include "stdafx.h" #include "cv.h" #include "highgui.h" int main(){ IplImage *img= cvLoadImage("C:/fu.jpg");//讀取圖片 cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE); cvShowImage("Example1",img);//在Example1顯示圖片 // cvCopy(img,temp); IplImage* temp=cvCreateImage( //建立一個size為image,三通道8位的彩色圖 cvGetSize(img), IPL_DEPTH_8U, ); cvErode(img,temp,0,1);//腐蝕 cvShowImage("Example2",temp); cvDilate(img,temp,0,1);//膨脹 cvShowImage("Example3",temp); cvWaitKey(0);//暫停用於顯示圖片 cvReleaseImage(&img);//釋放img所指向的記憶體空間並且 cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); cvDestroyWindow("Example3"); return 0; } |
效果圖:
以上都是在模板3*3的情況下處理的,要是我們期望使用自己定義的模板時候,就需要自己做模板。
1 2 3 |
CVAPI(IplConvKernel*) cvCreateStructuringElementEx( int cols, int rows, int anchor_x, int anchor_y, int shape, int* values CV_DEFAULT(NULL) ); |
前兩個引數是定義模板的大小,後兩個引數是參考點的座標(比如預設3*3模板的參考點座標是2*2),第五個引數是模板的型別(可以是矩形,十字形,橢圓形,甚至是使用者自己定義形狀),最後一個引數是在使用自自定義形狀的時候,通過value傳遞模板的形狀。
模板的型別:
1 |
CVAPI(void) cvReleaseStructuringElement( IplConvKernel** element ); //釋放模板所佔用的記憶體 |
自定義5*5,參考點(3,3)的矩形模板的測試程式碼:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include "stdafx.h" #include "cv.h" #include "highgui.h" int main(){ IplImage *img= cvLoadImage("C:/fu.jpg");//讀取圖片 cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE); cvShowImage("Example1",img);//在Example1顯示圖片 // cvCopy(img,temp); IplImage* temp=cvCreateImage( //建立一個size為image,三通道8位的彩色圖 cvGetSize(img), IPL_DEPTH_8U, ); IplConvKernel * myModel; myModel=cvCreateStructuringElementEx( //自定義5*5,參考點(3,3)的矩形模板 5,5,2,2,CV_SHAPE_RECT ); cvErode(img,temp,myModel,1); cvShowImage("Example2",temp); cvDilate(img,temp,myModel,1); cvShowImage("Example3",temp); cvWaitKey(0);//暫停用於顯示圖片 cvReleaseStructuringElement(&myModel); cvReleaseImage(&img);//釋放img所指向的記憶體空間並且 cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); cvDestroyWindow("Example3"); return 0; } |
效果圖:
參考:學習opencv