形态学图像处理

1.二值形态学腐蚀:

Z2中的集合A和B, A-B表示为B对A的腐蚀,即B对A的腐蚀是一个用z平移的B包含在A中的所有的点z的集合。

假定集合B是一个结构元,则腐蚀表达式等价于下面的表达式,其中,A c是A的补集,Φ是空集。

2.二值形态学膨胀:

A和B是Z2中的集合, A+B表示为B对A的膨胀。表达式是以B关于它的原点的映像,并且以z对映像进行平移为基础。

B对A的膨胀是所有位移z的集合,假定B是一个结构元,A是被膨胀的集合。

代码如下: 

clc        %清除命令窗口的内容
close all  %关闭所有的Figure窗口
clear all  %清除工作空间的所有变量

%%  二值形态学腐蚀和膨胀函数
function output = corrosion_expansion(A,input,element)
%当A=0时为二值形态学腐蚀,A=1时为二值形态学膨胀
%element采用3×3的结构元

[m,n] = size(input);%输入图像尺寸大小
P = zeros(m+2,n+2);
P(2:m+1,2:n+1) = input(:,:); 

if (A ~=0 && A~=1)
    error('请输入A的值为0或1,0为二值形态学腐蚀操作,1为二值形态学膨胀操作');
end

if (A == 0)  %腐蚀
    output = zeros(m,n);
    for i = 2:m+1
        for j = 2:n+1
            if (element & P(i-1:i+1,j-1:j+1)) == element
                output(i-1,j-1) = 1;
            end
        end
    end
end

if (A == 1) %膨胀
    output = ones(m,n);
    for i = 2:m+1
        for j = 2:n+1
            if (element & P(i-1:i+1,j-1:j+1)) == zeros(3,3)
                output(i-1,j-1) = 0;
            end
        end
    end
end       

end

3.边界抽取

使用形态学操作实现边界提取的思路:

(1)首先对图像A进行腐蚀,

(2)之后再使用A减去腐蚀后的结果即是提取到的边界

二值腐蚀算法:

用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“与”操作,如果都为1,结果图像的该像素为1。否则为0。

结果:使二值图像减小一圈。

把结构元素B平移a后得到Ba,若Ba包含于X,我们记下这个a点,所有满足上述条件的a点组成的集合称做X被B腐蚀(Erosion)的结果。用公式表示为:

如图所示:

二值膨胀算法:

用3x3的结构元素,扫描图像的每一个像素,用结构元素与其覆盖的二值图像做“或”操作。如果都为0,结果图像的该像素为0。否则为1。

结果:使二值图像扩大一圈

如图所示:

clc        %清除命令窗口的内容
close all  %关闭所有的Figure窗口
clear all  %清除工作空间的所有变量
%%
I = imread('Fig0914(a).tif');
I1 = im2bw(I);
subplot(231),imshow(I),title('原图像');
subplot(232),imshow(I1),title('二值化后的图像');
element = [1,1,1;1,1,1;1,1,1];
I2 = corrosion_expansion(0,I1,element);
subplot(233),imshow(I2),title('腐蚀后的图像');
I3 = corrosion_expansion(1,I1,element);
subplot(234),imshow(I3),title('膨胀后的图像');
I4 =  differencing(I1,I2);
subplot(235),imshow(I4),title('形态学提取边界');

%%  二值形态学腐蚀和膨胀函数

function output = corrosion_expansion(A,input,element)
%当A=0时为二值形态学腐蚀,A=1时为二值形态学膨胀
%element采用3×3的结构元

[m,n] = size(input);%输入图像尺寸大小
P = zeros(m+2,n+2);
P(2:m+1,2:n+1) = input(:,:); 

if (A ~=0 && A~=1)
    error('请输入A的值为0或1,0为二值形态学腐蚀操作,1为二值形态学膨胀操作');
end

if (A == 0)  %腐蚀
    output = zeros(m,n);
    for i = 2:m+1
        for j = 2:n+1
            if (element & P(i-1:i+1,j-1:j+1)) == element
                output(i-1,j-1) = 1;
            end
        end
    end
end

if (A == 1) %膨胀
    output = ones(m,n);
    for i = 2:m+1
        for j = 2:n+1
            if (element & P(i-1:i+1,j-1:j+1)) == zeros(3,3)
                output(i-1,j-1) = 0;
            end
        end
    end
end       

end



%% 图像交集、差集和补集函数

% 图像交集函数
function output = intersection(input1,input2)

[m,n] = size(input1);
output = zeros(m,n);
for i = 1:m
    for j = 1:n
        if input1(i,j)==1 && input2(i,j) == 1
            output(i,j) = 1;
        end
    end
end

end

% 图像差集函数
function output = differencing(input1,input2)

[m,n] = size(input1);
output = zeros(m,n);
for i = 1:m
    for j = 1:n
        if input1(i,j)==1 && input2(i,j)==0
            output(i,j) = 1;
        end
    end
end

end

% 图像补集函数
function output = complementation(input1,input2)

[m,n] = size(input1);
output = zeros(m,n);
for i = 1:m
    for j = 1:n
        if input1(i,j)==1 || input2(i,j)==1
            output(i,j) = 1;
        end
    end
end

end

实验结果:​​​​​​​

        对图像进行二值化处理,把f1中的非0值变成1,数值0值变成逻辑0,可以发现,在图像轮廓外出现了一些零散的尖锐点。

        对二值化后的图像进行腐蚀,可以看出腐蚀后的图像轮廓相比原图像有一定的凹陷,二值图像中的尖锐点被消除,部分被细化。

        对二值图像进行膨胀,膨胀后二值图像被粗化,可以明显观察到膨胀图像比原图像的线条粗很多,尖锐点也被放大,图像发生了膨胀。

        形态学边界提取是先对二值图像进行腐蚀,然后计算原图像与腐蚀图像的差集。由实验结果可以发现,边界提取的结果能很好地表示图像的边界信息,完整地显示出了图像的轮廓。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值