2010-01-12 69 views
1

我有两个图像,我试图共同注册 - 即,一个可能是一个球在图片的中心,另一个是在边缘附近的同一个球,我试图找到像素麻木,我必须移动第二个图像,以便球会在同一个地方。 (我实际上使用3D MRI脑扫描,但原理是相同的)。MATLAB的fminsearch函数

我已经写了一个函数,它可以将球向左,向右,向上或向下移动给定数量的像素,以及另一个函数,该函数比较中间球图像与翻译的相关性球在边缘的图像。当两个球位于相同的位置时,相关函数将返回0,其他位置的数字大于0。

我试图使用fminsearchdocumentation)找到相关函数的最低的最优翻译(即球在同一个地方被),像这样:

global reference_im unknown_im; 

starting_trans = [0 0 0]; 
trans_vector = fminsearch(@correlate_images,starting_trans) 

correlate_images.m:

function r = correlate_images(translate) 
global reference_im unknown_im; 

new_im = move_image(unknown_im,translate(1),translate(2),translate(3)); 

% This bit is unimportant to the question 
% but you can see how I calculate my correlation 
r = 1 - corr(reshape(new_im,[],1),reshape(reference_im,[],1)); 

有两个问题,首先是fminsearch坚持要将平移向量的float值传递给correlate_images函数。有什么方法可以告诉它只有整数是必要的吗? (我会节约大量的CPU周期!)

其次,当我运行这个程序所产生的trans_vector总是一样starting_trans - 我想这是因为没有最低已经找到了,但有另外一个原因它只是显然不工作?

非常感谢!

编辑

我发现我的想法是输出trans_vector总是一样starting_trans的原因。 fminsearch查看起始值,然后从这里开始每个方向的小增量,这个小增量总是小于1,这意味着相关的结果将是完美匹配的(因为move_image将返回与用于子像素移动的输入图像)。我将继续致力于说服matlab仅针对整数值进行fminsearch!

+0

在进一步的研究(http://www.mathworks.se/matlabcentral/newsreader/view_thread/155500)事实证明'fminsearch'不能用于整数问题!因此,我不得不放弃使用这种方法。感谢你的帮助! – 2010-01-13 11:29:12

回答

0

图像处理工具箱中有一个非常类似的演示,它使用归一化的互相关函数normxcorr2来执行图像配准。为了避免重复同样的事情,请直接演示:

Registering an Image Using Normalized Cross-Correlation

+0

这应该是非常有用的,谢谢!唯一的问题(正如我在上面提到的mmr),我会(在某个时候)需要考虑旋转和移动,并且我需要同时进行这两个操作,所以我不能使用normxcorr2开箱即用。我会在图像处理工具箱中寻找,但它们可能有一个体面的功能或者两个!欢呼 – 2010-01-13 10:24:55

+0

@JP:有些技术可以使用傅立叶变换计算图​​像之间的旋转配准。它们并不像使用FFT来计算超常位移一样简单,但它们工作得很好。我手边没有参考资料,但如果您搜索(我喜欢谷歌学者)“图像注册”,您可能会发现一些好的想法。 – 2011-02-06 07:25:38

1

首先,我想说Matlab可能不是这个问题的最佳工具。我会看看Elastix,这是一个围绕ITK中的注册函数的漂亮的用户友好包装。您可以获得各种注册技巧,并且这两个程序的手册都很好地解释了图像注册的具体细节。

其次,对于这种简单的平移注册,您可以使用FFT。正向转换两个图像,将图像相乘(逐点!即使用A。* B,而不是A * B,因为这些是不同的操作,首先是你想要的),并且逆时针转换的来源是您需要的平移量。 Numerical Recipes in C有很好的解释; here's a link to an index pdf。 FFT版本和直接相关版本之间的速度差异很大; FFT是O(N log N),而相关方法是O(N * M),其中M是搜索邻域中的像素数。如果要允许搜索整个图像,则相关性将变为O(N * N),这将比FFT版本花费更长的时间。将参数从浮点数更改为整数不会解决问题。

fminsearch函数使用浮点数(如果我能猜出编码器决策背后的原因),原因是对于不是测试问题的问题(即,体积中的球体),通常需要使用子像素分辨率来执行正确的注册。查看ITK文档,了解此方法背后的原因。第三,我建议在Matlab中编写这个程序的好方法(如果你还想这么做的话!),同时仍然强制整数相关将会避免fminsearch函数,它将要使用浮点数。试试这样的:

startXPos = -10; %these parameters dictate the size of your search neighborhood 
startYPos = -10; %corresponds to M in the above explanation 
endXPos = 10; 
endYPos = 10; 
optimalX = 0; 
optimalY = 0; 
maxCorrVal = 0; 
for i=startXPos:endXPos 
    for j = startYPos:endYPos 
     %test the correlation of the two images here, where one image is shifted to another 
     currCorrVal = Correlate(image1, image2OffsetByiAndj); 
     if (currCorrVal > maxCorrVal) 
      maxCorrVal = currCorrVal; 
      optimalX = i; 
      optimalY = j; 
     end 
    end 
end 

从这里,你只需要写偏移功能。这样,你就避免了浮动问题,并且你也增加了你的翻译矢量(我没有看到任何方式让这个矢量在你提供的函数中移动,这可能解释了你的移动不足)。

+0

下面是使用MATLAB进行FFT(也是2D)的一个很好的介绍:http://blogs.mathworks.com/steve/category/fourier-transforms/ – Mikhail 2010-01-12 21:31:09

+0

非常感谢您的详细回复!不幸的是,MATLAB在这里是选择的工具(这是我作为物理硕士学生的最后一年实验的一部分),但Elastix看起来可能对下一个更加开放的项目有用! – 2010-01-13 10:13:54

+0

FFT可能非常有用 - 谢谢!我将不得不调查频率域在旋转数据集之间的变化程度...... – 2010-01-13 10:15:57