(MATLAB)三维形态学腐蚀膨胀算法(代码)

(MATLAB)三维形态学腐蚀膨胀算法(代码)

by HPC_ZY

MATLAB三维形态学腐蚀膨胀操作代码。做三维形态学操作的时候,没找到MATLAB自带的函数,所以自己写了一个。

膨胀

膨胀比较简单,总之就是原始图像某一位置为1时,把周围的全置为1

%% 三维膨胀
function out = dilate3d(in,r)

[R,C,S] = size(in);
% 生成球形结构元
[se,n,rx,ry,rz] = strel3d(r);

out = false(R,C,S);
for i = 1+rx:R-rx
    for j = 1+ry:C-ry
        for k = 1+rz:S-rz
            if in(i,j,k) == 1                
                for idx = 1:n
                    out(i+se(idx,1),j+se(idx,2),k+se(idx,3)) = 1;
                end
            end
        end
    end
end

end

腐蚀

与膨胀相反,当原始图像某邻域范围内全为1,中心点才能置为1

%% 三维腐蚀
function out = erode3d(in,r)
% 生成球形结构元
[R,C,S] = size(in);
[se,n,rx,ry,rz] = strel3d(r);

out = false(R,C,S);
for i = 1+rx:R-rx
    for j = 1+ry:C-ry
        for k = 1+rz:S-rz
            out(i,j,k) = 1;
            for idx = 1:n
                if in(i+se(idx,1),j+se(idx,2),k+se(idx,3))<1
                    out(i,j,k) = 0;
                    break;                    
                end
            end                                   
        end
    end
end

end

结构元与其他函数

生成结构元的函数,建议三个方向半径一致。
注:由于此处结构元特殊的判定方式,当三个方向半径不一致时,最终尺寸不一定等于用户输入的尺寸,但大体形态是相同的

%% 生成三维球形结构元
function [se,n,rx,ry,rz] = strel3d(r)

% 判断用户输入半径
if length(r)<2
    rx = r;
    ry = r;
    rz = r;
elseif length(r)>2
    rx = r(1);
    ry = r(2);
    rz = r(3);
else
    rx = r(1);
    ry = r(1);
    rz = r(2);
end

% 生成球形二值图 并获得目标索引
[x,y,z] = meshgrid(-rx:rx,-ry:ry,-rz:rz);
[x,y,z] = find3d(sqrt(x.^2+y.^2+z.^2)<(rx+ry+rz)/2.5); % 注意这里的判定方式
se = [x-rx-1,y-ry-1,z-rz-1];

n = size(se,1);

end

find3函数(类似MATLAB自带的find,但这里是三维的)

%% 找到满足条件的值,类似MATLAB自带的find,但这里是三维的
function [x,y,z] = find3d(in)

[M,N,~] = size(in);

idx = find(in);

z = ceil(idx/M/N);
idx = idx-(z-1)*M*N;
y = ceil(idx/M);
x = idx-(y-1)*M;

end

测试

clear; close all; clc

%% 生成测试图像(三维)
im = zeros(50,50,50);
im(20:30,20:30,10:40) = 1;

%% 形态学操作
% 膨胀
im1 = dilate3d(im,5);

% 腐蚀
im2 = erode3d(im,3);
im3 = erode3d(im,[3,3,10]);

%% 显示结果
viewer3d(im,double(im1),im,double(im2),im,double(im3))
% 注意,仅仅运行到这里,是什么都不会显示的哦
% viewer3d是可视化界面,你得和它互动,要显示什么你的自己学。
% 这个东西怎么用,就参考“其他=2.关于viewer3d函数”

测试结果如下,其中 红色为原始模型,绿色为操作后模型,黄色为重叠部分
在这里插入图片描述


其他

  1. 为了简便易理解,所以没有进行优化,运行速度一般
  2. 关于viewer3d函数,可查看另一篇文章
  3. 三维开闭运算可以组合腐蚀膨胀实现,这里就不贴代码了
  4. 如果有其他问题或需求,欢迎评论区留言或私信
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值