Source code for eloy.detection
"""
Source detection utilities for astronomical images.
This module provides functions for cleaning close coordinates and detecting
stars in images using thresholding and morphological operations.
"""
import numpy as np
from skimage.measure import label, regionprops
from skimage.morphology import binary_opening
[docs]
def clean_close_coords(coords, min_separation=30):
"""
Remove coordinates that are closer than a minimum separation.
Parameters
----------
coords : np.ndarray
Array of (x, y) coordinates.
min_separation : float, optional
Minimum allowed separation between coordinates.
Returns
-------
np.ndarray
Filtered array of coordinates with minimum separation enforced.
"""
keep = {}
distances = np.linalg.norm(coords[:, None] - coords[None, :], axis=-1)
distances[np.eye(len(coords), dtype=bool)] = np.nan
for i in range(len(coords)):
keep[i] = True
for i in range(len(coords)):
if keep[i]:
distance = distances[i]
idxs = np.where(distance < min_separation)[0]
for j in idxs[idxs > i]:
keep[int(j)] = False
return np.array([coords[i] for i in range(len(coords)) if keep[i]])
[docs]
def stars_detection(image, threshold=5, opening=5):
"""
Detect stars in an image using thresholding and morphological opening.
Parameters
----------
image : np.ndarray or object with .data attribute
2D image data or object with .data attribute.
threshold : float, optional
Detection threshold in units of standard deviation above the median.
opening : int, optional
Size of the morphological opening kernel.
Returns
-------
list
List of skimage.measure._regionprops.RegionProperties objects for detected regions.
"""
opening_kernel = np.ones((opening, opening))
flat_image = image.flatten()
median = np.nanmedian(flat_image)
flat_image = flat_image[np.abs(flat_image - median) < np.nanstd(flat_image)]
threshold = threshold * np.nanstd(flat_image) + median
regions = regionprops(
label(binary_opening(image.data > threshold, opening_kernel)), image
)
regions = sorted(regions, key=lambda x: x.intensity_max, reverse=True)
return regions