MATLAB';s-fminsearch函数

MATLAB';s-fminsearch函数,matlab,Matlab,我有两张图片,我正试图共同注册-也就是说,一张可能是图片中心的一个球,另一张是靠近边缘的同一个球,我试图找到我必须移动第二张图片的像素数,这样球就会在同一个位置。(我实际上使用的是3D MRI脑部扫描,但原理是一样的) 我编写了一个函数,它将球向左、向右、向上或向下移动给定数量的像素,以及另一个函数,它将中心图像中球的相关性与边缘图像中的平移球进行比较。当两个球位于同一位置时,相关函数将返回0,其他位置的数字将大于0 我试图使用fminsearch()找到相关函数最小值的最佳平移(即,球位于同一

我有两张图片,我正试图共同注册-也就是说,一张可能是图片中心的一个球,另一张是靠近边缘的同一个球,我试图找到我必须移动第二张图片的像素数,这样球就会在同一个位置。(我实际上使用的是3D MRI脑部扫描,但原理是一样的)

我编写了一个函数,它将球向左、向右、向上或向下移动给定数量的像素,以及另一个函数,它将中心图像中球的相关性与边缘图像中的平移球进行比较。当两个球位于同一位置时,相关函数将返回0,其他位置的数字将大于0

我试图使用
fminsearch
()找到相关函数最小值的最佳平移(即,球位于同一位置),如下所示:

关联图像。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\u images
函数中。有没有办法告诉它只需要整数?(我会节省大量的cpu周期!)

其次,当我运行这个程序时,产生的
trans\u向量
总是与
开始的
相同-我假设这是因为没有找到最小值,但是否还有另一个原因它显然不起作用

非常感谢

编辑


我发现了我所认为的输出
trans\u向量
总是与
启动trans
相同的原因。
fminsearch
查看起始值,然后在每个方向上都有一个小增量,这个小增量总是小于1,这意味着相关性的结果将是完美匹配的(因为
move\u图像
将返回与亚像素运动输入图像相同的结果)。我将继续努力说服matlab只对整数值进行fminsearch

首先,我想说Matlab可能不是解决这个问题的最佳工具。我想看一看,它是一个非常用户友好的包装器,用于包装中的注册函数。您可以获得各种注册技术,两个程序的手册都很好地解释了图像注册的细节

其次,对于这种简单的平移配准,可以使用FFT。正向变换两幅图像,将图像相乘(逐点!即,使用A.*B,而不是A*B,因为它们是不同的操作,第一个是您想要的),并且逆变换中应该有一个峰值,其与原点的偏移量是您需要的平移量。有一个很好的解释。FFT版本和直接相关版本之间的速度差异很大;FFT是O(N logn),而相关方法是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

从这里开始,您只需编写offset函数。这样,您就避免了浮点问题,并且还增加了平移向量(我看不出该向量在您提供的函数中有任何移动的方式,这可能解释了您缺少移动的原因)。

首先,我想说Matlab可能不是解决此问题的最佳工具。我想看一看,它是一个非常用户友好的包装器,用于包装中的注册函数。您可以获得各种注册技术,两个程序的手册都很好地解释了图像注册的细节

其次,对于这种简单的平移配准,可以使用FFT。正向变换两幅图像,将图像相乘(逐点!即,使用A.*B,而不是A*B,因为它们是不同的操作,第一个是您想要的),并且逆变换中应该有一个峰值,其与原点的偏移量是您需要的平移量。有一个很好的解释。FFT版本和直接相关版本之间的速度差异很大;FFT是O(N logn),而相关方法是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
从这里开始,您只需编写offset函数。这样,您就避免了浮点问题,并且还增加了转换向量(我看不出有任何方法可以解决这个问题)