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函数”
测试结果如下,其中 红色为原始模型,绿色为操作后模型,黄色为重叠部分