2

我在python中找到了用于图像注册的简单代码here

在简单的翻译情况下,我们有:

def translation(im0, im1):
    """Return translation vector to register images."""
    shape = im0.shape
    f0 = fft2(im0)
    f1 = fft2(im1)
    ir = abs(ifft2((f0 * f1.conjugate()) / (abs(f0) * abs(f1))))
    t0, t1 = numpy.unravel_index(numpy.argmax(ir), shape)
    if t0 > shape[0] // 2:
        t0 -= shape[0]
    if t1 > shape[1] // 2:
        t1 -= shape[1]
    return [t0, t1]

但我不明白这部分:

if t0 > shape[0] // 2:
    t0 -= shape[0]
if t1 > shape[1] // 2:
    t1 -= shape[1]

有时它也会给出错误的转变,所以似乎 t0,t1 的输出取决于某些情况?也许是因为我只有图像之间的重叠?

编辑:

这也是我使用其他工具的测试:

对于来自维基百科的狮子 img(纯转变)

http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images/im1.png http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images /im2.png

ImageJ 给出(第二个堆栈相对于第一个堆栈)x= -20 y= -23 R= 0.8126828943265368(好)

phaseCorrelate 给出 x= 20.19 y= 22.56 (它给出了第一张图像相对于第二张图像的偏移或有什么问题?)

没有汉窗 x= 20.23 y= 22.43

python代码 x= -22 y=- 14

在 (1,1) 处裁剪的狮子和狮子头的测试模板匹配

http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images/im2.png http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images /temp_1_1.png

ImageJ 给出(第二个堆栈相对于第一个堆栈)x= 0 y= 1 R= 0.7905318337522524(失败 1 pix)

phaseCorrelate 给出 x= -0.4 y= -2.45 (不准确且方向相反)

没有汉窗 x= -0.88 y= -0.86

相同,但在 (18,23) 处收割

http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images/im2.png http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images /temp_18_23.png

ImageJ 给出(第二个堆栈相对于第一个堆栈)x= 17 y= 23 R= 0.8119669906973865(失败 1 pix)

phaseCorrelate 给出 x= -18 y= -23(好但方向相反)

没有汉窗 x= -18 y= -22.98

测试图像分为 2 个具有 % 重叠的图像(无噪声、无失真)

http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images/1.png http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images /2.png

(第二个堆栈相对于第一个堆栈) x= 744 y= 0 R= 0.9999999999999999

phaseCorrelate 给出 x= -743.48 y= 0(相反方向)

没有汉窗 x= -743.49 y= 0

真实数据测试

http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images/1_.PNG http://dl.dropbox.com/u/8841028/FFT%20template%20matching/test%20images /2_.PNG

ImageJ 给出(相对于第一个堆栈的第二个堆栈)x= 878 y= -3 R= 0.9667271264277764

phaseCorrelate 给出 x= 34.47 y= -35.5(错误)

没有汉窗 x= 146.32 y= 3.06(错误)

我使用的 opencv 2.4.3(prebuild) 代码。

#include "stdafx.h"
#include <opencv.hpp>

using namespace cv;
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    Mat im1= imread("1.PNG",0);
    Mat im2= imread("2.PNG",0);

    Mat r1;
    im1.convertTo(r1,CV_64F);
    Mat r2;
    im2.convertTo(r2,CV_64F);

    Point2d phaseShift;

    if(r1.cols!=r2.cols||r1.rows!=r2.rows)
    {
        int n_cols= max(r1.cols,r2.cols);
        int n_rows= max(r1.rows,r2.rows);

        Mat r1_pad;
        copyMakeBorder(r1,r1_pad,0,n_rows-r1.rows,0,n_cols-r1.cols, BORDER_CONSTANT, Scalar::all(0));
        Mat r2_pad;
        copyMakeBorder(r2,r2_pad,0,n_rows-r2.rows,0,n_cols-r2.cols, BORDER_CONSTANT, Scalar::all(0));

        Mat hann;
        createHanningWindow(hann, r1_pad.size(), CV_64F);
        phaseShift = phaseCorrelate(r1_pad, r2_pad, hann);
    }
    else
    {
        Mat hann;
        createHanningWindow(hann, r1.size(), CV_64F);
        phaseShift = phaseCorrelate(r1, r2, hann);
    }

    return 0;
}
4

0 回答 0