【问题标题】:Calculating unique transformation for multiple images in folder计算文件夹中多个图像的唯一转换
【发布时间】:2014-04-08 11:55:17
【问题描述】:

我目前正在编写一个对齐脚本,它可以很好地对齐两个图像。通常,我得到一个包含 50 多个细胞图像的数据集。我通常会根据荧光珠计算转换矩阵 (T)。然而,该 T 矩阵在非极化细胞中引起极化,表明转化不是最佳的。因此我切换到另一个脚本,它根据细胞而不是珠子计算 T 矩阵。这个新的 T 矩阵几乎完美地对齐了一小部分细胞,但总是有一部分图像对齐不太好。 我想继续对齐单元格,因为这个脚本比珠子对齐要好得多。为了为每个图像获得最佳 T 矩阵,我想为每个图像对计算唯一的 T 矩阵。我对 Matlab 不是很熟练,所以我能想到的解决方案不起作用。

您可以在下面找到当前脚本。它通过创建我想要对齐的图像的变量并将它们分配给脚本中的 im1 和 im2 来发挥作用:

    function [T] = alim(im1, im2, Tstart)
    %ALIM Determines the transformation between the cameras.

    im3=im2;
    if (nargin>2)
    im2=imwarp(im2, Tstart,'OutputView',imref2d(size(im1)));
    end


    optimizer = registration.optimizer.RegularStepGradientDescent;
    optimizer.MaximumIterations=500;
    metric = registration.metric.MattesMutualInformation;

    T = imregtform(im2, im1, 'affine', optimizer, metric);

    if (nargin>2)
    T.T=Tstart.T*T.T;
    end

    figure;
    imshowpair(im1,imwarp(im3,T,'OutputView',imref2d(size(im1))));
    end

我尝试合并一个循环,该循环按顺序从文件夹中导入所有图像并将它们分配给 im1 和 im2。但是,出现的问题是数据的类型从uint16变成了cell,不能用于这种类型的转换。一个在脚本中定义文件夹'CAM1'和'CAM2'的位置以及这些文件夹中的图像数量('imnum')

    for i:imnum
    x{i}=imread(strcat(link,'CAM1\',num2str(i),'.tif'));
    y{i}=imread(strcat(link,'CAM2\',num2str(i),'.tif'));

我想听听您对这个问题的看法,并希望您能就如何一次性将图像导入文件夹中并保持数据类型 uint16 提出一些建议。我总是乐于接受建议,所以如果您对如何解决我的问题有其他想法,如果您与我分享,我会很高兴。如果有什么不清楚的地方,请联系我!

致以诚挚的问候,

雷尼尔

【问题讨论】:

  • x 是一个元胞数组,其中每个元素 x{i} 是一个 uint16 数组。
  • 那么如果我将im1分配给x{i},它应该根据uint16数据进行转换吗?
  • 我不知道,我不知道您是如何尝试调用该函数的。 T = alim(x{i}, y{i}, tstart); 应该可以正常工作。
  • 确实在某种程度上有效。但是,它只读取第一张图像并使用该图像来计算 T 矩阵。因此,即使我在文件夹中读取了多个图像,也只有第一个以正确的方式使用。我编写了一个脚本,其中 imread 上述文件,并在 [T]=alim(x{i},y{i},Tstart); 中将 x{i} 和 y{i} 用于 im1 和 im2;
  • 脚本在一个小数据集上工作,现在生成一个包含对应于每个单独图像的转换的单元格。我想接受你的回答,@Peter,但我看不到接受你回答的复选标记。我如何接受你的回答?

标签: matlab alignment transformation


【解决方案1】:

x 是一个元胞数组,其中每个元素 x{i} 是一个 uint16 数组。元胞数组可以保存任何其他数据类型,包括更多元胞数组,并且是包装对象集合的好方法,尤其是当它们的大小和/或类型可能不同时。

在您的情况下,只需像这样调用您的函数:

T = alim(x{i}, y{i}, tstart);

或者,更好的是,将输出矩阵放入类似的单元格中:

T{i} = alim(x{i}, y{i}, tstart);

【讨论】:

    猜你喜欢
    • 2012-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    相关资源
    最近更新 更多