opencv中的更通用的形態學


  為了處理更為復雜的情況,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;
}
View Code

  測試結果:

  

   

 

 參考:學習opencv


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM