膨胀:是将A与核B卷积,求局部最大值,可以使得图像中的亮区域逐渐增长;
腐蚀:是膨胀的反操作,一般来说膨胀会扩张区域和腐蚀缩小区域
膨胀可以填补细小的坑洞而腐蚀可以消除细的突起,maltab中使用imdalite(A,B)表示使用核B膨胀A区域,核B可以通过strel函数获得,如strel('disk',3)表示半径为3的圆。maltab中使用imerode(A,B),核B可以通过strel函数获得,如strel('disk',3)表示半径为3的圆。
A = imread('target.png');
B = strel('disk',10);
A1 = imdilate(A,B);
A2 = imerode(A,B);
A3 = imdilate(A,1B);
subplot(221),imshow(A1;
title('imdilate膨胀原始图像');
subplot(222),imshow(A1);
title('使用B后1次膨胀后的图像');
subplot(223),imshow(A2);
title('使用B后2次膨胀后的图像');
subplot(224),imshow(A3);
title('使用B后3次膨胀后的图像');
如上图可见膨胀可以把白色区域放大,把细小的黑色区域填满(填满的大小取决于B核),腐蚀则是黑色区域填充白色区域,白色细小区域被填满(原图来源冈萨雷斯书)。
.开运算和闭运算都包含膨胀与腐蚀操作,开运算是先腐蚀在膨胀,其作用是消除小的亮孤立点,剩余两区域基本不变;
闭运算是先膨胀再腐蚀,起作用是将亮区域连接在一起,迭代开运算或者是闭运算不是膨胀--腐蚀--膨胀--腐蚀而是膨胀--膨胀--腐蚀--腐蚀(这个是在opencv中会用到)。
a = imread('target.png');
B=strel('disk',10);
A1=imopen(a,B);
A2=imclose(a,B);
A3 = imclose(A1,B);
A4 = imopen(A2,B);
subplot(221),imshow(A1);
title('开运算图像');
subplot(222),imshow(A2);
title('闭运算图像');
subplot(223),imshow(A3);
title('先开后闭图像');
subplot(224),imshow(A4);
title('先闭后开图像');
通过上图可以看出开运算把孤立的白色区域覆盖了,而闭运算把黑色区域覆盖了,将两者结合,可以消除孤立点可用于除噪。
当图像相减与开运算和闭运算结合的时候会产生顶帽变换和底帽变换,顶帽是图像减去开运算操作,而底帽是图像减去闭运算操作; 顶帽运算常用于暗背景上的亮物体,而底帽变换则用于相反的情况,在opencv中底帽变换被称为黑帽就是这个原因
(我猜的因为黑底帽变换,省去了底字,但是maltab省去了黑字)。
对于这两个运算针对不同的图片会有不同的想象,可以多试下,我随便找个图像试的,相比之前多了一些文理,也算是增加了对比度吧,这两个在分割这一块用的比较多。
mark(2015 12 13)