Source code for astrophot.utils.initialize.center
import numpy as np
[docs]
def center_of_mass(image):
"""Determines the light weighted center of mass"""
ii, jj = np.meshgrid(np.arange(image.shape[0]), np.arange(image.shape[1]), indexing="ij")
center = np.array((np.sum(image * ii), np.sum(image * jj))) / np.sum(image)
return center
[docs]
def recursive_center_of_mass(image, max_iter=10, tol=1e-1):
"""Determines the light weighted center of mass in a progressively smaller window each time centered on the previous center."""
center = center_of_mass(image)
for i in range(max_iter):
width = (image.shape[0] / (3 + i), image.shape[1] / (3 + i))
ranges = (
slice(
max(0, int(center[0] - width[0])), min(image.shape[0], int(center[0] + width[0]))
),
slice(
max(0, int(center[1] - width[1])), min(image.shape[1], int(center[1] + width[1]))
),
)
subimage = image[ranges]
if subimage.size < 9:
return center
new_center = center_of_mass(subimage)
new_center += np.array((ranges[0].start, ranges[1].start))
if np.linalg.norm(new_center - center) < tol:
return new_center
center = new_center
return center