Почему моя 2D взвешенная гистограмма все еще смещена после смещения от взаимных корреляций? - PullRequest
0 голосов
/ 06 сентября 2018

Первоначально у меня было 3 изображения ярких объектов вблизи центра (массивы 600x600), а также отдельное эталонное изображение той же формы. Я хотел найти относительные сдвиги центроида в каждом изображении по отношению к эталонному изображению, выполнив взаимные корреляции, который был успешным. то я хотел бы использовать эти относительные сдвиги для создания 2D-взвешенной гистограммы отдельных изображений, которые прекрасно центрированных относительно эталонного изображения. Однако, когда я проверил другую взаимную корреляцию между взвешенной гистограммой и контрольным изображением, чтобы проверить, я ожидал относительное смещение (0,000, 0,000), но получил что-то отличное от нуля. Почему это? Я думал, что теперь они должны быть сосредоточены в одной и той же позиции. Мой код ниже.

import numpy as np
from skimage import feature
from photutils import centroids

# Find precise (subpixel) coordinates of centroid in reference image
x_0, y_0 = centroids.centroid_1dg(ref_img) #uses photutils Gaussian fit

# Cross-correlations: 3 individual images vs. reference image -- indiv_imgs is a list of the 3 image arrays
dx, dy = [], []
for i in range(3):
    data = indiv_imgs[i]
    # Shift (below) is in [y, x] format
    shift, error, diffphase = feature.register_translation(ref_img, data, 1000, space='real')
    dx.append(x_0+shift[1])
    dy.append(y_0+shift[0])

# Generate weighted 2D histogram given relative shifts
x, y = np.meshgrid(np.arange(600), np.arange(600))
bins = np.linspace(-300, 300, 601)

dx, dy = np.array(dx)[:, None, None]-x[None, ...], np.array(dy)[:, None, None]-y[None, ...]
h, xe, ye = np.histogram2d(dx.ravel(), dy.ravel(), bins=bins, weights=indiv_imgs.ravel())

# Check result: cross-correlation of weighted histogram vs. reference image -- relative shifts should be 0, but aren't!
shift_new, error_new, diffphase_new = feature.register_translation(ref_img, h, 1000, space='real')
print('Detected pixel offset (y, x): {}'.format(shift)) #for some reason this is nonzero: (-0.19, 0.87)
...