开运算和闭运算正是根据腐蚀和膨胀的不可逆性。演变而来的。先腐蚀后膨胀的过程就称为开运算。 闭运算是通过对腐蚀和膨胀的还有一种不同次序的运行而得到的, 闭运算是先膨胀后腐蚀的过程,其功能是用来填充物体内细小空洞、连接邻近物体、平滑其边界, 同一时候不明显改变不明显改变其面积。 參考代码例如以下所看到的:
IplImage *src=0;
IplImage *dst=0;
IplConvKernel *element=0;
int element_shape=CV_SHAPE_CROSS;
int max_iters=20;
int open_close_pos=0;
int erode_dilate_pos=0;
void ImageOpenClose(int pos) {
int n=open_close_pos-max_iters;
int an=n>0?
n:-n; element = cvCreateStructuringElementEx(an*2+1,an*2+1,an,an,element_shape,0);//创建结构元素 if (n<0) { cvErode(src,dst,element,1);//腐蚀图像 cvDilate(dst,dst,element,1);//膨胀图像 } else { cvDilate(dst,dst,element,1);//膨胀图像 cvErode(src,dst,element,1);//腐蚀图像 } cvReleaseStructuringElement(&element); cvShowImage("Open/Close",dst); } void ImageErodeDilate(int pos){ int n=erode_dilate_pos-max_iters; int an=n>0?
n:-n; element = cvCreateStructuringElementEx(an*2+1,an*2+1,an,an,element_shape,0); if (n<0){ cvErode(src,dst,element,1); } else { cvDilate(src,dst,element,1); } cvReleaseStructuringElement(&element); cvShowImage("Erode/Dilate",dst); }
測试主程序int _tmain(int argc, _TCHAR* argv[]){
char *filename ="Tulips.jpg";
if( (src = cvLoadImage(filename,1)) == 0 )
return -1;
dst=cvCloneImage(src);
cvNamedWindow("Open/Close",1);
cvNamedWindow("Erode/Dilate",1);
open_close_pos = erode_dilate_pos = max_iters;
cvCreateTrackbar("iterations","Open/Close",&open_close_pos,max_iters*2+1,ImageOpenClose);
cvCreateTrackbar("iterations","Erode/Dilate",&erode_dilate_pos,max_iters*2+1,ImageErodeDilate);
for (;;) {
int c;
ImageOpenClose(open_close_pos);
ImageErodeDilate(erode_dilate_pos);
c= cvWaitKey(0);
if (c==27) {
break;
}
switch(c) {
case 'e':
element_shape=CV_SHAPE_ELLIPSE;
break;
case 'r':
element_shape=CV_SHAPE_RECT;
break;
case '/r':
element_shape=(element_shape+1)%3;
break;
default:
break;
}
}
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvDestroyWindow("Open/Close");
cvDestroyWindow("Erode/Dilate");
return 0;
}
输出结果:
关于Computer Vision很多其它讨论与交流。敬请关注本博客和新浪微博songzi_tea.