Matlab 计算文件夹中多个图像的唯一变换

Matlab 计算文件夹中多个图像的唯一变换,matlab,alignment,transformation,Matlab,Alignment,Transformation,我目前正在编写一个对齐脚本,它可以很好地对齐两个图像。通常,我会得到一个包含50多个细胞图像的数据集。我通常根据荧光珠计算变换矩阵(T)。然而,这种T矩阵在未极化的细胞中引起极化,表明这种转换不是最优的。因此,我切换到另一个脚本,它基于细胞而不是珠子计算T矩阵。这种新的T矩阵几乎完美地对准了一小部分细胞,但总有一部分图像的对准不太好。 我想继续单元格上的对齐,因为此脚本比珠子上的对齐效果好得多。为了获得每个图像的最佳T矩阵,我想计算每个图像对的唯一T矩阵。我对Matlab不是很熟练,所以我能想到

我目前正在编写一个对齐脚本,它可以很好地对齐两个图像。通常,我会得到一个包含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,而cell不能用于这种类型的转换。在脚本中定义文件夹“CAM1”和“CAM2”的位置以及这些文件夹中的图像数量(“imnum”)

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

致以亲切的问候


Reinier

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

在您的情况下,只需按如下方式调用函数:

T = alim(x{i}, y{i}, tstart);
或者,更好的是,将输出矩阵放入类似的单元格中:

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

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;该脚本处理一个小数据集,现在生成一个单元格,其中包含对应于每个单独图像的变换。彼得,我愿意接受你的回答,但我看不到接受你回答的复选标记。我如何接受你的回答?
T{i} = alim(x{i}, y{i}, tstart);