Matlab底层源代码实现图像腐蚀,膨胀操作(与Halcon效果一致)

理论基础

      数学形态学的运算以腐蚀和膨胀这两种基本运算为基础,引出了其他几个常用的数学形态运算,最常见的基本运算有七种,分别是:膨胀,腐蚀,开运算,闭运算,击中,细化和粗化,它们是全部形态学的基础,运用这些运算及其组合可以进行图像形状和结构的分析及处理,常见于图像预处理工作中,为后面图像分割,特征提取,边界检测,图像滤波等打下基础。
      腐蚀是数学形态学的两种最为基本的运算之一,腐蚀在数学形态学的作用是消除物体边界点,使边界向内部收缩,可以把小于结构元素的物体去除。这样选取不同大小的结构元素,就可以去除不同大小的物体。如两个区域之间有细小的通道,通过腐蚀可以将两个区域分开。腐蚀的数学表达式是
                                                       S = X ⨂ B = { x , y ∣ B x y ⊆ X } S=X\bigotimes B=\left \{ x,y\mid B_{xy}\subseteq X\right \} S=XB={x,yBxyX}
      膨胀是数学形态学中除腐蚀之外的另一种基本运算。膨胀在数学形态学中的作用与腐蚀的作用正好相反,它是对二值化物体边界点进行扩充,将与物体接触的所有背景点合并到该物体当中。如果两个物体之间的距离比较近,则膨胀运算可能将两个物体连接在一起,膨胀对于填补空洞狠有用。膨胀的数学表达式为:
                                                       S = X ⨁ B = { x , y ∣ B x y ∩ X ≠ φ } S=X\bigoplus B=\left \{ x,y\mid B_{xy}\cap X\neq \varphi \right \} S=XB={x,yBxyX=φ}

图像腐蚀操作

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%图像的腐蚀操作
%Author:Zhu
%时间:2022.6
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
image = imread("F:\\fabrik.png");
image_matrix=image(:,:,1);
image_matrix=double(image_matrix);
[height,width,channels]=size(image);
image_out = zeros(height,width);

%输入的卷积核大小
maskHeight=11;
maskWidth=11;

%当前像素值
currentPixel=0;

for i=(maskHeight+1)/2:height-(maskHeight+1)/2
    for j=(maskWidth+1)/2:width-(maskWidth+1)/2
        minValue = 255;
        %更新最大值
        for k=1:maskHeight
            for p=1:maskWidth
                currentPixel = image_matrix(i-(maskHeight+1)/2+k,j-(maskWidth+1)/2+p);
                if(currentPixel<minValue)
                    minValue = currentPixel;
                end
            end
        end
        %更新卷积核中心的数值
        image_out(i,j)=minValue;
    end
end

%图像边缘像素修改
for i=1:height
    for j=1:width
        if(i>(maskHeight+1)/2 && i<height-(maskHeight+1)/2 && j>(maskWidth+1)/2 && j<width-(maskWidth+1)/2)
            image_out(i,j)= image_out(i,j);
        else
            image_out(i,j)= image_matrix(i,j);
        end
    end
end

%显示图像
image_out = uint8(image_out);
subplot(1,2,1);
imshow(image);
subplot(1,2,2);
imshow(image_out);

图像膨胀操作

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%图像的膨胀操作
%Author:Zhu
%时间:2022.6
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clc;
image = imread("F:\\fabrik.png");
image_matrix=image(:,:,1);
image_matrix=double(image_matrix);
[height,width,channels]=size(image);
image_out = zeros(height,width);

%输入的卷积核大小
maskHeight=11;
maskWidth=11;

%当前像素值
currentPixel=0;

for i=(maskHeight+1)/2:height-(maskHeight+1)/2
    for j=(maskWidth+1)/2:width-(maskWidth+1)/2
        maxValue = 0;
        %更新最大值
        for k=1:maskHeight
            for p=1:maskWidth
                currentPixel = image_matrix(i-(maskHeight+1)/2+k,j-(maskWidth+1)/2+p);
                if(currentPixel>maxValue)
                    maxValue = currentPixel;
                end
            end
        end
        %更新卷积核中心的数值
        image_out(i,j)=maxValue;
    end
end

%图像边缘像素修改
for i=1:height
    for j=1:width
        if(i>(maskHeight+1)/2 && i<height-(maskHeight+1)/2 && j>(maskWidth+1)/2 && j<width-(maskWidth+1)/2)
            image_out(i,j)= image_out(i,j);
        else
            image_out(i,j)= image_matrix(i,j);
        end
    end
end

%显示图像
image_out = uint8(image_out);
subplot(1,2,1);
imshow(image);
subplot(1,2,2);
imshow(image_out);

Halcon算子

*腐蚀图像
gray_erosion_rect (Image, ImageMin, 11, 11)
*膨胀图像
gray_dilation_rect (Image, ImageMax, 11, 11)

Halcon与源码图像效果比对

Halcon腐蚀效果
在这里插入图片描述
Matlab源码腐蚀效果
在这里插入图片描述
Halcon膨胀效果
在这里插入图片描述
Matlab源码膨胀效果
在这里插入图片描述

  • 5
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

手写不期而遇

感谢你的打赏,也欢迎一起学习

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值