如何有效比较分辨率是原始图像两倍的另一幅图像与原始图像?

3
我有两组3D图像(以2D堆栈的形式呈现)。图像A10微米,大小为:1000 x 1024 x 1017,而图像B是5微米,大小为:2004 x 2048 x 2036。我想对A随机选择的一组2D切片进行一些计算,然后将其与B的相同切片集进行比较。然而,由于B对于每个A的切片具有两倍的切片数,因此将B的两个切片与A的每个切片进行比较是否合理?如果是这样,我该如何确定哪两个B的切片构成了一个A的切片?
在思考这个问题时,我还考虑了使用imresize函数将A的每个2D切片放大2倍进行比较。考虑到我完全忽略了z坐标的变化,这样做可以将这个新的BA进行比较吗?
谢谢。

2
我认为您应该将图像A调整为与B相同的大小,并仔细选择插值方案。请注意,如果它们真正是2D图像,则不能仅对每个2D切片进行插值,而需要作为整体来执行。 - Ander Biguri
感谢 @Ander Biguri。我正在考虑使用 'nearest''linear' 作为插值方案。对于您回答的第二部分,如果我将插值作为一个整体进行,仍然存在一个问题,即如何决定哪两个 B 的切片构成 A 的切片。有任何建议吗?注:这些是来自微CT的真实图像。 - User110
我自己从事微CT工作。通常情况下,你不仅知道体素的大小,还知道实际单位(假设它们来自相同的投影)。因此,您现在可以知道体素中心的实际位置,并使用这些位置获取“大”A。我建议使用线性插值。 - Ander Biguri
好的。非常感谢您,Ander。 - User110
你知道每个样本的位置吗?我的意思是,你能为A中每个样本以及B中每个样本分配一个三元组(x,y,z)的位置吗?如果可以,那么您需要重新采样A,以便在与B相同的位置上具有其值。至于您使用的插值类型,这取决于您需要多少精度和数据的性质。 - AnonSubmitter85
显示剩余2条评论
2个回答

1
由于您提到这是微CT,我假设两个图像是同一对象的不同大小分辨率。这意味着像素具有特定的空间位置,而不仅仅是值,因此对于这种情况,在两个图像中没有像素匹配(假设像素是立方体中心的无穷小点)。
因此,假设在图像A中,像素中心的位置是它们的索引(1,1,1),(1,1,2)等。这意味着图像从“世界值”0.5开始(像素边界),并以size(imgA)+0.5结束。
现在,首先将所需的插值像素坐标转换为此范围。然后,imgB像素中心位于位置(ind-0.5)*size(imgA)/size(imgB)+0.5
例子:假设。
size(imgA,1)=3; size(imgB,1)=4;

因此,imgA 中的像素位于 x 位置 1:3。使用上述公式,imgB 上的像素位于 [0.8750 1.6250 2.3750 3.1250]。 请注意,第一个像素距离图像边界的距离为 0.375,下一个像素位于 0.750.375*2 的两倍)。
我们将一个更高分辨率的图像缩放到相同的“真实世界”坐标。
现在进入正题。
我们需要在参考图像(A)中创建所需的坐标。为此,我们执行以下操作:
[y, x, z]=...
   ndgrid((1:size(imgB,1)-0.5)*size(imgA,1)/size(imgB,1)+0.5),...
          (1:size(imgB,2)-0.5)*size(imgA,2)/size(imgB,2)+0.5),...
          (1:size(imgB,3)-0.5)*size(imgA,3)/size(imgB,3)+0.5);

现在这三个变量都拥有我们想要的坐标。注意!每个变量的大小为 size(imgB) !!! 你需要总共拥有 5*size(imgB) 的内存才能使用它们。

现在我们可以进行插值。

imAinB=interp3(imgA,x,y,z,'linear'); % Or nearest

1
非常感谢您,安德尔。我会按照您的建议去做,但是我应该早点提到,缺乏足够的计算机内存是我寻找解决方法的原因(昨天我尝试过类似的操作,但由于计算机内存不足而感到沮丧)。否则,@Anonsubmitter85建议的重采样方法就可以解决问题了。我可以使用处理软件(Avizo)来完成这个操作。 - User110
无论如何,另一个想法是使用“ A”的坐标从“ B”的中心提取子卷。然而,这里有一个小问题:由于“ A”的“ z-coord”是奇数,因此在该方向上无法进行精确提取(至少从我使用的处理软件来看)。 - User110
@User110 很有趣。我建议您使用新信息开一个新问题,但要寻找最节省内存的方法来完成此操作。 - Ander Biguri
好的,我会翻译。 - User110

0

看起来你的函数是imresize3。你可以使用以下代码将一个体积更改为另一个体积的尺寸:

B = imresize3(V,[numrows numcols numplanes])

你还可以探索插值方法。

  1. 它是在R2017a中引入的(重要信息)
  2. 在操作者的情况下,这可能不是一个好的情况,因为像素具有特定的空间位置。
- Ander Biguri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接