1、原理
图像开运算与闭运算与膨胀和腐蚀运算有关,由膨胀和腐蚀两个运算的复合与集合操作(并、交、补等)组合成的运算构成。开运算与闭运算依据腐蚀和膨胀演变而来。
1)开运算:先对图像腐蚀后膨胀。
A○S= (AΘS)⊕ S
作用:用来消除小的物体,平滑形状边界,并且不改变其面积。可以去除小颗粒噪声,断开物体之间的粘连。
2)闭运算:先对图像膨胀后腐蚀
A●S= (A⊕S)Θ S
作用:用来填充物体内的小空洞,连接邻近的物体,连接断开的轮廓线,平滑其边界的同时不改变面积。
2、开运算的实现
imgPath = 'E:opencv_picsrc_picpic2.bmp'; img = imread(imgPath); img=rgb2gray(img); img = 255-img; se = strel('square', 5); img2 = imerode(img, se); img3 = imdilate(img2, se); subplot(1,3,1),imshow(img),title('原始图像'); subplot(1,3,2),imshow(img2),title('腐蚀后'); subplot(1,3,3),imshow(img3),title('膨胀后');
效果如下图。腐蚀消除了小的噪点,保留了最大的一个噪点,膨胀之后还原了噪点的形状。图像上,草莓蒂上的小花纹已经消失。
放大后观察,原图里有较大的斑点,6*5的方块(纵向缺1个点),腐蚀后只剩下1个点,膨胀后变为5*5的方块。
放大到像素级可见,腐蚀图上的点(32,110)在膨胀图里被还原为5*5的块。
使用imopen函数,效果相同。
3、闭运算的实现
imgPath = 'E:opencv_picsrc_picpic2.bmp'; img = imread(imgPath); img=rgb2gray(img); img = 255-img; se = strel('square', 4); img2 = imdilate(img, se); img3 = imerode(img2, se); subplot(1,3,1),imshow(img),title('原始图像'); subplot(1,3,2),imshow(img2),title('膨胀后'); subplot(1,3,3),imshow(img3),title('腐蚀后');
闭运算效果如下图。
放大后,图像左侧的噪点在膨胀过程被连在一起,体积增大很多。腐蚀后形状发生了一些改变,体积变小很多。
使用大小为15的结构元素,se = strel('square', 15);草莓中间的空心圈变为实心圈。膨胀过程中,空心被高亮白色填充,但是花瓣部分已经连接在一起形状发生了较大改变。再次腐蚀后,去掉了膨胀造成的粘连,花瓣部分大体形状恢复。
在matlab里,使用imclose函数也可以达到上面先膨胀后腐蚀的效果。
4、总结
单独对比开运算和闭运算,对比图如下。
开运算先腐蚀后膨胀,去除了小的黑点,方块边缘变得圆润了,也就是开运算对图像轮廓进行平滑。
而闭运算先膨胀后腐蚀,把中心比较大的块连接为一个整体,填补了空白的缝隙。
开运算能够除去孤立的小点,毛刺和小桥,而物体的形状轮廓基本不变。
闭运算与开运算相反,能够填平前景物体内的小裂缝、间断和小孔,而总的位置和形状不变。
结构元素大小的不同将导致滤波效果的不同。
不同的结构元素的选择导致了不同的分割,即提取出不同的特征。
5、参考文献
1、形态学开运算闭运算
https://www.jianshu.com/p/2eae48a44f83
2、More Morphology Transformations
尊重原创技术文章,转载请注明。