数学形态学图像处理——图像腐蚀,膨胀,开闭运算(《学习OpenCV》练习题第五章第四题)
a部分练习的是图像相减法,图像的减法又称减影技术,是指对同一景物在不同时间拍摄的图像或同一景物在不同波段的图像进行相减。
其主要作用如下:
1、去除不需要的叠加性图案;
2、运动检测;
3、梯度图像。
这是两张在不同时刻拍摄的图像,为了充分展示出效果,我将图像中的物体移动了一下:
图 一
图 二
这两幅图像相减,并取绝对值之后的结果图像:
图 三
可以看出,图像相减可以去除两张图像中相同的部分,找出两幅图像中不同的部分。
b部分对图三(即图像相减的结果图像)先进行腐蚀(Erosion)操作,再进行膨胀(Dilation)操作,实际上就是一个形态学开运算(Opening)。
图三执行形态学开运算后的结果图像:
图 四
其结果和图三比较,可以看出开运算的结果是去除了小的明亮区域,并且剩余的明亮区域被隔绝,但其大小不变。
c部分对图三(即图像相减的结果图像)先进行膨胀操作,再进行腐蚀操作,实际上就是一个形态学闭运算(Closing)。
图三执行形态学开运算后的结果图像:
图 五
其结果和图三比较,可以看出闭运算的结果是填充了明亮的对象内细小的黑暗空洞,连接了邻近对象,但其基本的大小不变。
总而言之,开运算常用于去除小的亮点,闭运算去除小的暗点。
最后,贴上代码:
1 #include <stdio.h> 2 #include <opencv\cv.h> 3 #include <opencv\highgui.h> 4 #include <opencv_libs247d.h> 5 6 7 int main() 8 { 9 IplImage * src1 = cvLoadImage("frame_28.bmp", CV_LOAD_IMAGE_GRAYSCALE); 10 IplImage * src2 = cvLoadImage("frame_52.bmp", CV_LOAD_IMAGE_GRAYSCALE); 11 12 IplImage * diff12 = cvCreateImage(cvGetSize(src1), src1->depth, src1->nChannels); 13 IplImage * cleandiff = cvCreateImage(cvGetSize(src1), src1->depth, src1->nChannels); 14 IplImage * dirtydiff = cvCreateImage(cvGetSize(src1), src1->depth, src1->nChannels); 15 16 cvAbsDiff(src1, src2, diff12); 17 18 // Opening 19 cvErode(diff12, cleandiff, NULL, 1); 20 cvDilate(cleandiff, cleandiff, NULL, 1); 21 22 // Closing 23 cvDilate(diff12, dirtydiff); 24 cvErode(dirtydiff, dirtydiff); 25 26 cvShowImage("abs diff", diff12); 27 cvShowImage("clean diff", cleandiff); 28 cvShowImage("dirty diff", dirtydiff); 29 30 cvSaveImage("absdiff.png", diff12); 31 cvSaveImage("cleandiff.png", cleandiff); 32 cvSaveImage("dirtydiff.png", dirtydiff); 33 34 cvSaveImage("src1.png", src1); 35 cvSaveImage("src2.png", src2); 36 37 cvWaitKey(0); 38 39 cvReleaseImage(&src1); 40 cvReleaseImage(&src2); 41 cvReleaseImage(&diff12); 42 cvReleaseImage(&cleandiff); 43 cvReleaseImage(&dirtydiff); 44 cvDestroyAllWindows(); 45 46 return 0; 47 }