opencv中的圖像形態學——腐蝕膨脹


  腐蝕膨脹是圖像形態學比較常見的處理,腐蝕一般可以用來消除噪點,分割出獨立的圖像元素等。

  一般腐蝕操作對二值圖進行處理,腐蝕操作如下圖,中心位置的像素點是否與周圍領域的像素點顏色一樣(即是否是白色點,即值是否為255),若一致,則保留,不一致則該點變為黑色(值即為0)

  

  opencv中的腐蝕操作:

CVAPI(void)  cvErode( const CvArr* src, CvArr* dst,
                      IplConvKernel* element CV_DEFAULT(NULL),
                      int iterations CV_DEFAULT(1) );

  前兩個參數比較熟悉,第三個參數是用於傳遞模板的信息,默認是(NULL),即為3*3的模板,第四個參數是迭代的次數(即該腐蝕操作做幾次)

  opencv中的膨脹操作其實就是腐蝕的反操作:

CVAPI(void)  cvDilate( const CvArr* src, CvArr* dst,
                       IplConvKernel* element CV_DEFAULT(NULL),
                       int iterations CV_DEFAULT(1) );

  測試代碼:

  

#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,
        3
        );

    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;
}
View Code

  效果圖:

  

 

  以上都是在模板3*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傳遞模板的形狀。

模板的類型:

CVAPI(void)  cvReleaseStructuringElement( IplConvKernel** element ); //釋放模板所占用的內存

 

自定義5*5,參考點(3,3)的矩形模板的測試代碼:

#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,
        3
        );

    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;
}
View Code

效果圖:

參考:學習opencv

 


免責聲明!

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



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