为了处理更为复杂的情况,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