膨胀和腐蚀时形态学处理的基础。膨胀是在二值图像中“加长”或“变粗”的操作。腐蚀“收缩”或“细化”二值图像中的对象。而边界提取是用原图像减去对原图像腐蚀后的图像得到的。基于膨胀和腐蚀可以计算出形态学图像梯度,它可以使图像中灰度级的跃变更加急剧,并且这种方法对边缘方向性的依赖很小,很适合用来提取图像边界。图像的膨胀和腐蚀另一种应用便是top-hat变换,这种变换可以突出图像中阴影处的细节,增强图像中不是很明显的细节信息。
一、实验技术论述
1.图像集合的交、差、并、补
两个图像集合A和B的交集表示为:
两个图像集合A和B的差集表示为:
两个图像集合A和B的补集表示为:
2.膨胀
膨胀是在图像中“加长”或“变粗”的操作。计算时,结构元素通常用0和1的矩阵表示,结构元素的原点必须明确标明。将结构元素的原点平移过整个图像区域,并且核对哪些地方与值为1的像素重叠。
由于 和 是 中的集合,A被B膨胀定义为:
这个公式是以得到B的相对于它自身原点的映象并且由z对映象进行移位为基础的。A被B膨胀是所有位移z的集合,这样,B的映像和A至少有一个元素是重叠的。集合B通常叫做膨胀的结构元素。根据这种解释,上式可以改写成:
该公式可以解释为将卷积模版B按其原点翻转后逐步移动B以便B能够滑过图像A,因此膨胀过程可以看成是一种卷积过程。
膨胀计算过程如下:
⑴ 用结构元素B,扫描图像A的每一个像素
⑵ 用结构元素与其覆盖的二值图像做“与”操作
⑶ 如果都为0,结果图像的该像素为0,否则为1。
3.腐蚀
腐蚀可以看作是对图像中的对象的“收缩”或“细化”操作。对Z中的集合A和B,使用B对A进行腐蚀,并定义为:
这个公式表明,使用B对A进行腐蚀就是所有B中包含于A的点z的集合用z平移。
腐蚀计算过程如下:
⑴ 用结构元素B,扫描图像A的每一个像素
⑵ 用结构元素与其覆盖的二值图像做“与”操作
⑶ 如果都为1,结果图像的该像素为1,否则为0。
4.边界提取
集合A的边界表示为β(A),它可以通过先由B对A腐蚀,而后用A减去腐蚀得到。即:
5.灰度膨胀
用b函数对f进行的灰度膨胀定义为:
该公式表示将结构元素的原点平移过整个图像区域,每个点的膨胀值是在跨度为b的区间内f与b之和的最大值。
6.灰度腐蚀
用b函数对f进行的灰度腐蚀定义为:
7.形态学图像梯度
腐蚀、膨胀经常用于计算图像形态学梯度,表示为g:
该公式表示用膨胀后的图像减去腐蚀后的图像,形态学图像梯度的作用是使输入图像的灰度级跃变更加剧烈。
8.top-hat变换
top-hat变换用g表示,定义为
该公式表示用原图像减去开操作后的图像,top-hat变换对于增强图像细节很有帮助。
二、实验结果讨论
1.膨胀后图线条变粗了,同时也出现了许多额外的亮点,应该是原图中存在微小不可见的亮点引起的。而腐蚀后的图片线条明显变细了,边界提取使用原图减去腐蚀后的图片,所以被腐蚀去掉的像素就被保留下来,显示来的就相当于图像边界。见图1。
2.对于灰度图像的腐蚀,其结果便是扩大灰度变化区域中亮的区域,见图2,两眼中间的较亮的区域范围变大了,细线条的地方也变粗了,整幅图像也明显比原图亮了。而灰度的腐蚀操作结果与膨胀相反,其结果是扩大灰度变化区域中暗的区域,图2中两眼中间暗的区域扩大了,原来的细线条也变暗、模糊了,整体亮度较原图稍暗。
3.图像的梯度变换是增加图像中灰度的跃变程度,而图像灰度的跃变一般发生在图像边界处,所以图像梯度变换可以很好地提取出图像边界,见图3。而top-hat变换在于突出图像中模糊的细节,从图3右中可以看出,原图中比较模糊的线条细节被显示出来。
三、实验结果
图1 二值图像的腐蚀、膨胀、边界提取结果图
图2 灰度图膨胀、腐蚀结果图
图 3 灰度图梯度变换、tophat变换后结果图
附录:
function myxingtaixue
B=ones(3,3);
%———-;
im=imread(’ Fig9.20(left).jpg’);
subplot(221);imshow(im);title(‘原图’)
im_N1=ImageDilation(im,B);
subplot(222);imshow(im_N1);title(‘膨胀后图片’)
im_N2=ImageErode(im,B);
subplot(223);imshow(im_N2);title(‘腐蚀后图片’)
im_N3=set_operators(im,im_N2,’差’);
subplot(224);imshow(im_N3);title(‘边界提取图’)
%———-
im=imread(‘Fig9.39(a).jpg’);
figure
subplot(221);imshow(im);title(‘原图’)
im_N4=GrayImageDilation(im,B);
subplot(222);imshow(im_N4);title(‘膨胀后灰度图片’)
im_N5=GrayImageErode(im,B);
subplot(223);imshow(im_N5);title(‘腐蚀后灰度图片’)
%———-
figure
im_N6=im_N4-im_N5;
subplot(221);imshow(im_N6);title(‘梯度变换后灰度图片’)
im_N7=im-GrayImageDilation(im_N5,B);
subplot(222);imshow(im_N7);title(‘tophat变换后灰度图片’)
function im_N=GrayImageDilation(im,B) %灰度图膨胀程序
[m,n]=size(im);
zero_ac=zeros(m,1);
zero_ar=zeros(1,n+2);
im1=[zero_ar;[zero_ac,im,zero_ac];zero_ar];
im1=double(im1);
im_N=zeros(m,n);
for i=2:m+1
for j=2:n+1
im_N(i-1,j-1)=max(max([im1(i-1,j-1) im1(i-1,j) im1(i-1,j+1); im1(i,j-1)…
im1(i,j) im1(i,j+1) ;im1(i+1,j-1) im1(i+1,j) im1(i+1,j+1)]+B));
end
end
im_N=uint8(im_N);
function im_N=GrayImageErode(im,B) %灰度图腐蚀程序
[m,n]=size(im);
zero_ac=zeros(m,1);
zero_ar=zeros(1,n+2);
im1=[zero_ar;[zero_ac,im,zero_ac];zero_ar];
im1=double(im1);
im_N=zeros(m,n);
for i=2:m+1
for j=2:n+1
im_N(i-1,j-1)=min(min([im1(i-1,j-1) im1(i-1,j) im1(i-1,j+1); im1(i,j-1)…
im1(i,j) im1(i,j+1) ;im1(i+1,j-1) im1(i+1,j) im1(i+1,j+1)]-B));
end
end
im_N=uint8(im_N);
function im_N=ImageDilation(im,B) %二值图膨胀程序
[m,n]=size(im);
zero_ac=zeros(m,1);
zero_ar=zeros(1,n+2);
im1=[zero_ar;[zero_ac,im,zero_ac];zero_ar];
im_N=zeros(m,n);
for i=2:m+1
for j=2:n+1
N_zero=find([im1(i-1,j-1) im1(i-1,j) im1(i-1,j+1) im1(i,j-1)…
im1(i,j) im1(i,j+1) im1(i+1,j-1) im1(i+1,j) im1(i+1,j+1)]);
if size(N_zero,2)>0
im_N(i-1,j-1)=1;
end
end
end
function im_N=ImageErode(im,B) %二值图腐蚀程序
[m,n]=size(im);
zero_ac=zeros(m,1);
zero_ar=zeros(1,n+2);
im1=[zero_ar;[zero_ac,im,zero_ac];zero_ar];
im_N=zeros(m,n);
for i=2:m+1
for j=2:n+1
N_zero=find([im1(i-1,j-1) im1(i-1,j) im1(i-1,j+1) im1(i,j-1)…
im1(i,j) im1(i,j+1) im1(i+1,j-1) im1(i+1,j) im1(i+1,j+1)]);
if size(N_zero,2)==9
im_N(i-1,j-1)=1;
end
end
end
function im= set_operators( im1,im2,key ) %图像的交、差、补运算程序
if key==’交’
im=im1 & im2;
elseif key==’差’
im=im1 &~ im2;
else
im=~im1;
end