Как правильно исправить дрейф XY-изображения с помощью скрипта Python? - PullRequest
2 голосов
/ 26 марта 2019

Я новичок в кодировании, и это мой первый пост! В качестве первой серьезной задачи я пытаюсь реализовать простую подпрограмму коррекции смещения изображения в python (поэтому мне не нужно полагаться на плагины ImageJ) с использованием таких возможностей магии, как register_translation и fourier_shift.

Ниже вы можете найти то, что я сделал до сих пор, но вот мои основные вопросы относительно подхода:

Правильно ли применена коррекция сдвига?

. Одна вещь, которая мне не ясна, когда мы применяем пик взаимной корреляции с помощью БПФ для определения относительного сдвига, заключается в том, как этот подход различает дрейф изображения «артефакт» и движение реального объекта? (т.е. реальный сдвиг интенсивности пикселей).

. Я измерил дрейф для каждых двух последовательных изображений и исправил промежуток времени соответственно. Есть ли лучший способ сделать это?

. до сих пор я думаю, что мне удалось хотя бы частично исправить дрейф в моих фильмах, но конечный результат все еще показывает дрейф в 1 пиксель в случайном направлении, и мои фильмы в формате TIFF выглядят как «мерцающие» (из-за пикселя). но я должен применить коррекцию дрейфа по-другому!?

Будем рады некоторому пониманию не только моего конкретного вопроса, но и этой темы в целом.

# import the basics

import numpy as np
import matplotlib.pyplot as plt
from skimage import data
from skimage.feature import register_translation
from scipy.ndimage import fourier_shift
from skimage import io

'''  register translation estimates the cross-correlation peak by an FFT
i.e, identifies the relative shift between two similar-sized images
using cross-correlation in Fourier space '''

movie = mymovie
shifts = []
corrected_shift_movie = []

for img in range(0,movie.shape[0]):
    if img < movie.shape[0] - 1:

        shift, error, diffphase = register_translation(movie[0], movie[img + 1])

        img_corr = fourier_shift(np.fft.fftn(movie[img + 1]), shift)
        img_corr = np.fft.ifftn(img_corr)

        shifts.append(shift)
        corrected_shift_movie.append(img_corr.real)


# for plotting the xy shifts over time

shifts = np.array(shifts)
corrected_shift_movie = np.array(corrected_shift_movie)

x_drift = [shifts[i][0] for i in range(0,shifts.shape[0])]
y_drift = [shifts[i][1] for i in range(0,shifts.shape[0])]

plt.plot(x_drift, '--g' , label = ' X drift')
plt.plot(y_drift, '--r' , label = ' Y drfit')
plt.legend()

# checking drift for the new corrected movie

movie = corrected_shift_movie
shifts_corr = []

for img in range(0,movie.shape[0]):
    if img < movie.shape[0] - 1:

        shift, error, diffphase = register_translation(movie[0], movie[img + 1])
        shifts_corr.append(shift)

shifts_corr = np.array(shifts_corr)

x_drift = [shifts_corr[i][0] for i in range(0,shifts_corr.shape[0])]
y_drift = [shifts_corr[i][1] for i in range(0,shifts_corr.shape[0])]

plt.plot(x_drift, '--g' , label = ' X drift')
plt.plot(y_drift, '--r' , label = ' Y drfit')
plt.legend()

# saving the new corrected movie

import tifffile as tiff
movie_to_save = corrected_shift_movie

with tiff.TiffWriter('drift_correction.tif', bigtiff=True) as tif:
        for new_image in range(movie_to_save.shape[0]):
            tif.save(movie_to_save[new_image], compress=0)

...