2013-08-06 87 views
1

我正在开发一个工具,可以让您在三维“体积”上围绕/包围物体。我想通过标记“切片”1和3以及从该信息“填充”切片2来节省时间。在三维空间中的两个平面之间插值

两个简单的解决方案是:

1. slice2 = slice1 AND slice3 (gets the overlap between the two) 
2. slice2 = slice2 OR slice3 (true for any pixel true in either image) 

这些 OK,速度快,但我宁愿做一些通过使形状某种两者之间的平均/插值更智能。 你可以把它想象成试图找到连接飞机的悬崖表面,在高空和高空观看。

示例:从此3d矩阵填充切片2-4。 (使用montage创建) slices one through five

随意想出全新的想法。我将把我的想法放在下面。

我想过的一些东西可能会帮助你,回答者,但我一直无法成功地使用。
- 您可以在每张图片上做一个bwperim。
- 您可以尝试“平均”图像(或加权平均值)。

到目前为止,我已经得到了最好:

添加图像。 给你重叠和两个周长:
-内部周长(内部肯定会是1)
- 和一个外围(内部是有问题的)。
您还可以遮罩> 0和< 2的区域,这是此可疑区域的遮罩。
运行两个周边图像上的bwdist和掩盖了:

masked bwdist image

不知道如何从这里走,虽然。沿着该区域采用“最大”轮廓的线条可行,但我不确定如何强有力地做到这一点。

欢迎任何关于解决我的想法或任何其他想法的想法!

谢谢。

+1

使用'bwmorph(面具, 'skel中',INF)使得一个确定的答案。 为了做到这一点,我将它应用到切片[1 5]以获得切片3.然后切片[1 3]以获得2 ... – Frederick

回答

2

Schenk等人在阅读 “医学图像中3D对象的有效半自动分割”之后,我今天想到了这一点。人。

这里是我写的函数:

function out = interp_shape(top,bottom,num) 


if nargin<2; 
    error('not enough args'); 
end 
if nargin<3; 
    num = 1; 
end 
if ~num>0 && round(num)== num; 
    error('number of slices to be interpolated must be integer >0'); 
end 

top = signed_bwdist(top); % see local function below 
bottom = signed_bwdist(bottom); 

r = size(top,1); 
c = size(top,2); 
t = num+2; 

[x y z] = ndgrid(1:r,1:c,[1 t]); % existing data 
[xi yi zi] = ndgrid(1:r,1:c,1:t); % including new slice 

out = interpn(x,y,z,cat(3,bottom,top),xi,yi,zi); 
out = out(:,:,2:end-1)>=0; 

function im = signed_bwdist(im) 
im = -bwdist(bwperim(im)).*~im + bwdist(bwperim(im)).*im; 

enter image description here