為了處理更為復雜的情況,opencv中還支持更多的形態學變換。
形態學名稱 | 操作過程 | 操作名稱 | 是否需要temp參數 |
開操作 open | open(src)=先腐蝕,后膨脹 | CV_MOP_OPEN | 否 |
閉操作 close | close(src)=先膨脹,后腐蝕 | CV_MOP_CLOSE | 否 |
形態梯度 gradient | gradient(src)=dilate(scr)-erode(src) | CV_MOP_GRADIENT | 總是 |
“禮帽” topHat | topHat(src)=src-open(src) | CV_MOP_TOPHAT | src=dst的時候需要 |
“黑帽”blackHat | blackHat(src)=close(src)-src | CV_MOP_BLACKHAT | src=dst的時候需要 |
調用的函數:
CVAPI(void) cvMorphologyEx( const CvArr* src, CvArr* dst, CvArr* temp, IplConvKernel* element, int operation, int iterations CV_DEFAULT(1) );
前兩個函數前面講過了,注意到這里多了個temp的參數,因為圖形變換的時候是需要臨時變量的,使用該數組時,應該與原數組大小相同。(但這里有點納悶的是,為毛處理代碼不自己生成個臨時變量,需要用戶自己傳入temp,這里就有些不懂= =),第四個介紹過了,是自定義的模板,第五個是傳入上面表格中的操作名稱,這樣就會做相應的操作,最后一個也是前面介紹過的迭代次數。
測試代碼:

#include "stdafx.h" #include "cv.h" #include "highgui.h" int main(){ IplImage *img= cvLoadImage("C:/CIR.jpg");//讀取圖片 cvNamedWindow("Example1",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example2",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example4",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example5",CV_WINDOW_AUTOSIZE); cvNamedWindow("Example6",CV_WINDOW_AUTOSIZE); cvShowImage("Example1",img);//在Example1顯示圖片 // cvCopy(img,temp); IplImage* temp=cvCreateImage( //創建一個size為image,三通道8位的彩色圖 cvGetSize(img), IPL_DEPTH_8U, 3 ); //IplConvKernel * myModel; //myModel=cvCreateStructuringElementEx( //自定義5*5,參考點(3,3)的矩形模板 // 5,5,2,2,CV_SHAPE_RECT // ); //cvErode(img,temp,myModel,1); cvMorphologyEx( img,temp,temp,0,CV_MOP_OPEN,1 ); cvShowImage("Example2",temp); cvMorphologyEx( img,temp,temp,0,CV_MOP_CLOSE,1 ); cvShowImage("Example3",temp); cvMorphologyEx( img,temp,temp,0,CV_MOP_GRADIENT,1 ); cvShowImage("Example4",temp); cvMorphologyEx( img,temp,temp,0,CV_MOP_TOPHAT,1 ); cvShowImage("Example5",temp); cvMorphologyEx( img,temp,temp,0,CV_MOP_BLACKHAT,1 ); cvShowImage("Example6",temp); cvWaitKey(0);//暫停用於顯示圖片 //cvReleaseStructuringElement(&myModel); cvReleaseImage(&img);//釋放img所指向的內存空間並且 cvDestroyWindow("Example1"); cvDestroyWindow("Example2"); cvDestroyWindow("Example3"); cvDestroyWindow("Example4"); cvDestroyWindow("Example5"); cvDestroyWindow("Example6"); return 0; }
測試結果:
參考:學習opencv