Как разместить эллипсы вокруг источников на изображении
Я хотел бы подогнать эллипсы к источникам на данном спутниковом изображении:
Первое изображение - это исходное изображение, а второе - результат работы функции photutils.detect_sources (). Я хотел бы разместить эллипсы вокруг источников на втором изображении, и мое исследование подсказывает мне, что мне, вероятно, придется использовать это , но я не уверен, как это сделать.
Мой подход прямо сейчас заключается в использовании функции photutils.find_peaks() для получения таблицы координат x, y источников. Затем используйте photutils.isophote для подгонки эллипса. Итак, мой код до сих пор:
from photutils.segmentation import detect_sources, deblend_sources, SourceCatalog, source_properties
# find sources in image
segm = detect_sources(data, threshold=916.725674757175, npixels=4, connectivity=4)
# cat = source_properties(data, segm)
print(segm, '\n', cat)
# plot the image and the segmentation image
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 8))
ax1.imshow(data, origin='lower', interpolation='nearest')
ax2.imshow(segm.data, origin='lower', interpolation='nearest')
# use find_peaks on segmentation data from detect_sources()
source_data = segm.data
source_peaks_tbl = find_peaks(source_data, threshold=0, box_size=3)
source_peaks_tbl['peak_value'].info.format = '%.8g' # for consistent table output
print(source_peaks_tbl)
# Attempt to get x, y coords of sources
from photutils.isophote import Ellipse, EllipseGeometry, EllipseSample, EllipseFitter
x_corrs = [] # center pos
y_corrs = [] # center pos
sma = 20. #semimajor axis length in pixels
eps = 0.2 # ellipticity
pa = 35. / 180 * np.pi
ellipses = [] # store for ellipses
geometries = [] # store for ellipse geometries
for i in source_peaks_tbl:
x_corrs.append(i[0])
y_corrs.append(i[1])
for x, y in zip(x_corrs, y_corrs):
g = EllipseGeometry(x,y, sma, eps, pa) # create geometries
ellipse = Ellipse(data, geometry=g) # create ellipses
#isophote = ellipse.fit_isophote(sma=20.)
ellipses.append(ellipse)
geometries.append(g)
print([i.y0 for i in geometries[:5]]) # test, should be same as x_corrs[:5]
print(x_corrs[:5])
print(y_corrs[:5])
На этом этапе, я думаю, я бы использовал photutils.aperture.EllipticalAperture, но я хотел бы получить некоторые сведения, если я буду поступать правильно, поскольку раньше я никогда не устанавливал эллипсы для источников.