12.1.10.2.3. Later shifted image#

In this demo the lateral image shift is determined.

import numpy as np
import scipy
import scipy.misc
import scipy.ndimage
import matplotlib.pyplot as plt
from numpy.typing import ArrayLike


def plotImage(image: ArrayLike, cmap: str = "gray"):
    plt.figure()
    plt.gray()
    plt.imshow(image, cmap=cmap)
    plt.show()


if scipy.__version__ <= "0.14.0":
    # removed due to licensing reasons
    image = scipy.misc.lena()
else:
    image = scipy.misc.face()
    # Convert the image
    R = image[:, :, 0]
    G = image[:, :, 1]
    B = image[:, :, 2]
    image = R * 299.0 / 1000 + G * 587.0 / 1000 + B * 114.0 / 1000

plotImage(image)
demo LateralShift
C:\Workspace\itom_development_VS2019_Qt5.15.2_x64\itomProject\itom\demo\itom\dataProcessing\demo_LateralShift.py:26: DeprecationWarning:

scipy.misc.face has been deprecated in SciPy v1.10.0; and will be completely removed in SciPy v1.12.0. Dataset methods have moved into the scipy.datasets module. Use scipy.datasets.face instead.

Amount of pixel shift in x- and y-direction

xPixelShift = 16
yPixelShift = -7

Determine the ROI size: relative (centered) size of original image (relativeSize=1: original size).

row, col = image.shape
relativeSize = (
    np.floor(min(1 - abs(xPixelShift) / col, 1 - abs(yPixelShift) / row) * 10) / 10
)

x0 = int((col - col * relativeSize) / 2)
x1 = col - x0 + 1
y0 = int((row - row * relativeSize) / 2)
y1 = row - y0 + 1

not shifted ROI

image1 = image[y0:y1, x0:x1].copy()
plotImage(image1)

# Shifted ROI
image2 = image[
    y0 + yPixelShift : y1 + yPixelShift, x0 + xPixelShift : x1 + xPixelShift
].copy()
plotImage(image2)
  • demo LateralShift
  • demo LateralShift

Determine the pixel shift using discrete fast fourier transformation and complex conjugation of image2.

image1FFT = np.fft.fft2(image1)
image2FFT = np.conjugate(np.fft.fft2(image2))

# inverse fourier transformation of product -> equal to cross correlation
imageCCor = np.real(np.fft.ifft2(image1FFT * image2FFT))

# Shift the zero-frequency component to the center of the spectrum
imageCCorShift = np.fft.fftshift(imageCCor)
plotImage(imageCCorShift, "hot")
demo LateralShift

Determine the distance of the maximum from the center

row, col = image1.shape

yShift, xShift = np.unravel_index(np.argmax(imageCCorShift), (row, col))

yShift -= int(row / 2)
xShift -= int(col / 2)

print("shift of image1 in x-direction [pixel]: " + str(xShift))
print("shift of image1 in y-direction [pixel]: " + str(yShift))
shift of image1 in x-direction [pixel]: 16
shift of image1 in y-direction [pixel]: -7

Total running time of the script: (0 minutes 11.868 seconds)