在二维CT dicom去除床板时,当手臂与身体分开时,手臂也会消失,这里代码来至niubi Gao,做此记录。
function [img3d]=read3DCT(rootdir)
%读取CT或者CBCT到三维矩阵
if rootdir(end)~='\'
rootdir=[rootdir,'\'];
end
iname=dir(rootdir);
n=length(iname)-2;
y(n)=0;
for i=1:n
filename=[rootdir,iname(i+2).name];
info=dicominfo(filename);
y(i)=info.InstanceNumber; %CT slice所在层数,该数字不连续,且有部分是重叠的
end
mi=info.Width;
x=sort(y);
xu=unique(x);
num=length(xu);
img3d=zeros(mi,mi,num);
for i=1:num
index=find(xu(i)==y);
if length(index)>1
index=index(1);
end
filename=[rootdir,iname(index+2).name];
img=dicomread(filename);
img3d(:,:,i)=img;
end
img3d=uint16(img3d);
end
function [y] = lunkuoct(img)
%去除ct中床,提取人体的区域,FOV边缘高亮CT值有影响
img=double(img);
s=size(img);
z=zeros(s(1)+2,s(2)+2,s(3));
z(2:(s(1)+1),2:(s(2)+1),:)=img;
x=z>0;
for i=1:s(3)
x(:,:,i)=imfill(x(:,:,i),'holes');
end
se = strel('disk',7); %边界腐蚀
x1=imerode(x,se);
h=zeros(s(1),s(2),s(3));
h=x1(2:(s(1)+1),2:(s(2)+1),:);
img(h<1)=0;%去除FOV边缘影响
x2=img>500; %以500CT值分割联通域
L=bwlabeln(x2,18);
stats = regionprops(L,'Area');
area = cat(1,stats.Area);
index = find(area == max(area));
imgy = ismember(L,index);
for i=1:s(3)
imgy(:,:,i)=imfill(imgy(:,:,i),'holes');
end
y=imgy.*img;
y=uint16(y);
这里可以看出,由于床板在中间某处与人体有链接,不是能完全去除,不过手臂能完美保留。