pythonimage-processingscikit-imageimage-registration

Measuring shift between two images along one direction only


I have to measure shifts between two monochromatic images.

These images are actually spectra before calibration, which are very noisy and full of unwanted features, but they basically look like followingabstract image of a spectrum

I know that between different images, they have shifts along x-direction, but not along y-direction. And I want to know the amount of the shift along x-direction between them.

Luckily I found a function in skimage, register_translation, which can be used for arbitrary subpixel precision. But the problem is, I want to know shift along x-direction only, and I want resulting y-direction shift to be 0, but the program finds the shift to x and y at the same time, presumably along the direction perpendicular to the features. (marked as blue arrow in the figure) pixel coordinates and "eigenvector" for the image

So, I am wondering :

  1. is there any function or package in python that measures the shift between two images along one direction only, or even with any prior knowledge?

  2. what is a correct way of finding shifts between two noisy images? Would finding maximum cross-correlation value in FFT space would do the job?


Solution

  • Some simple maths should do in this situation if register_translation gives you the xy shift, be it in vector or component form. You can calculate the movement in x that would be required if the y shift was non-existent, which is what you want. I am travelling so unfortunately can't give you the graph right now, would recommend drawing the triangles out.

    The extra x shift required (x_extra) is defined by:

    x_extra = y * tan[arctan(y_shift/x_shift)]
    

    Which is simplified to:

    x_extra = y_shift^2 / x_shift
    

    Therefore, the total shift in x is:

    x_shift_total = x_shift + x_extra
    

    Where the x_shift is given to you by register_translation.

    If you then move imageA by x_shift_total, it should be aligned with imageB, assuming the x_shift given by register_translation is correct.

    @jni I would be keen to implement this as an option in register_translation!