引言
一般在matlab中可以用imrode实现膨胀腐蚀,但是全都无法定义结构元素中心,本文编写了一个可以设定中心(x0,y0)的erode函数,实现可变中心的图像腐蚀。同时,通过设置SE不关心元素为0,实现任意形状的SE腐蚀。
原理
类似于对二值图像的模板操作,
最终的效果是使结构元素外的图像变为背景,图像范围缩小。
SE为结构元素,可以自定义任意形状,主程序中设为3*3的十字。
中心可以定义为(x0,y0)=(1,2)
%eg【0 1 0
% 1 1 1
% 0 1 0】第1行第2列元素为原点时,(x0,y0)=(1,2)
代码:
可变中心的腐蚀函数:
function K=erode(I,se,x0,y0)
[m,n]=size(I);
[m1,n1]=size(se);
J=I;
K=J;
% Q=K;
se=se;
x0=x0;
y0=y0;
num=sum(sum(se==1));
for i=(1+x0-1):(m-(m1-x0))
for j=(1+y0-1):(n-(n1-y0))
bmatch=false;
s=0;
for k=1:m1
for l=1:n1
if se(k,l)==0 %不关心的元素
continue;
end
if se(k,l)==1%相关元素
if J(i+(k-(m1-1))-(x0-(m1-1)),j+(l-(n1-1))-(y0-(n1-1)))==255 %以原点对结构元素遍历
s=s+1;
end
end
if s==num
bmatch=true;
break;
end
end
end
if bmatch
K(i,j)=255;
else
K(i,j)=0;
end
end
end
主程序
I=zeros(45,45);
I(22:33,22:33)=255;
I(12:17,12:17)=255;
I(12:14,18:22)=255;
%设置3*3结构元素的原点(x0,y0)
x0=1;
y0=2;
se=[0 1 0;1 1 1;0 1 0;];%structure element
K=erode(I,se,x0,y0);
subplot(121)
imshow(K),title('腐蚀');
subplot(122)
imshow(J),title('原图');
效果
可以看到,经过腐蚀,前景范围缩小,转折处有十字结构元素处理的单点的突出。
自己可以对照matlab的workspace内部数据,观察作用的元素。