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

原文地址:https://www.cnblogs.com/huhuuu/p/3528992.html