我有两个图像,我正试图共同注册-,即,一个可能是一个球在图片的中心,另一个是相同的球在边缘附近,我试图找到麻木的像素,我必须移动第二个图像,以便球将在同一个地方。(我实际上是在使用3D MRI脑部扫描,但原理是一样的)。
我编写了一个函数,它将球左、右、上或下移动到给定的像素数,以及另一个函数,它将中心球图像与已翻译的边缘球图像的相关性进行比较。当两个球在同一个位置时,相关函数将返回0,对于其他位置,一个大于0的数字。
我试图使用fminsearch (文档)为相关函数的最小值(即球位于相同的位置)找到最优的翻译,如下所示:
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坚持将转换向量的浮点值传递给correlate_images函数。有没有办法告诉它只有整数是必需的?(我会节省大量的cpu周期!)
其次,当我运行这个程序时,生成的trans_vector总是与starting_trans相同--我认为这是因为没有找到最小值,但是还有其他原因吗?
非常感谢!
编辑
我发现了我认为输出trans_vector总是与starting_trans相同的原因。fminsearch查看起始值,然后从那里开始每个方向上的小增量,这个小增量总是小于1,这意味着相关的结果将是完美匹配的(因为move_image将返回与亚像素运动的输入图像相同的结果)。我将继续努力说服matlab只对整数值进行搜索!
发布于 2010-01-12 22:10:56
在图像处理工具箱中有一个非常类似的演示,它使用规范化的互相关函数normxcorr2来执行图像配准。为了避免重复相同的事情,直接查看演示:
发布于 2010-01-12 16:51:02
首先,我认为Matlab可能不是解决这个问题的最佳工具。我想看看埃勒斯特,它是ITK中注册函数的一个非常友好的包装器。你得到了各种各样的注册技术,这两个程序的手册都很好地解释了图像配准的细节。
其次,对于这种简单的平移配准,可以使用FFT。正向变换两个图像,将图像相乘(点态)!也就是说,使用A .* B,而不是A* B,因为它们是不同的操作,第一个操作是您想要的),并且在逆变换中应该有一个峰值,它的偏移量是您需要的平移量。C中的数值循环有一个很好的解释;这里有一个指向pdf索引的链接。FFT版本和直接相关版本之间的速度差异很大,FFT是O(N log ),而相关方法是O (N * M),其中M是搜索邻域中的像素数。如果您想要搜索整个图像,那么相关将变成O (N*N),这将比FFT版本花费更长的时间。将参数从浮点数更改为整数并不能解决问题。
fminsearch函数使用floats的原因(如果我能猜出编码器决定背后的原因)是,对于不是测试问题(即卷中的范围)的问题,您通常需要亚像素分辨率来执行正确的注册。查看ITK文档,了解这种方法背后的原因。
第三,我建议用Matlab编写这个程序的好方法(如果你还想这样做的话!)尽管仍然强制整型相关,但要避免使用fminsearch函数,而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从这里开始,您只需编写偏移量函数。这样,您就可以避免浮点问题,并且还在增加转换向量(我看不到该向量在所提供的函数中移动的任何方式,这可能解释了您缺乏移动的原因)。
https://stackoverflow.com/questions/2050510
复制相似问题