【发布时间】:2025-12-22 19:35:12
【问题描述】:
我正在处理星系图像,我想使用斑点检测来识别这些图像中心的星系,然后掩盖斑点之外的像素。我使用了 cv2 和 skimage 的斑点检测模块,但它们只返回圆形斑点。只要星系完全包含在圆圈内,这实际上就可以了,但问题是这些斑点往往小于非圆形斑点的实际大小(例如椭圆形的斑点)。
blob 太小的示例:
斑点检测结果与实际星系:
我尝试过高斯模糊。
是否有任何实现/方法让我能够获得也与银河系形状相匹配的斑点?如果可能,我想避免使用阈值方法。
我现在的代码(只是包的基本使用):
fig, axes = plt.subplots(4, 5, figsize=(25, 20), sharex=True, sharey=True)
ax = axes.ravel()
i = 0
for galaxy, original_img_data in nsa_galaxy_images.items():
blurred_img = skimage.filters.gaussian(original_img_data, sigma=3)
blobs_dog = blob_dog(blurred_img, max_sigma=100, threshold=.1, exclude_border=False, overlap=1)
blobs_dog[:, 2] = blobs_dog[:, 2] * sqrt(2)
ax[i].set_title(galaxy)
ax[i].imshow(original_img_data)
for blob in blobs_dog:
y, x, r = blob
c = plt.Circle((x, y), r, color='green', linewidth=2, fill=False)
ax[i].add_patch(c)
ax[i].set_axis_off()
i += 1
编辑 1:
正如@Cris Luengo 所建议的,这里的代码允许您下载类似的星系图像以在 python 中使用:
from astroquery.skyview import SkyView
FAMOUS_GALAXIES_LIST = ['NGC 450', 'NGC 5792', 'NGC 4437',
'NGC 1032', 'NGC 4753',
'NGC 60', 'NGC 5496', 'NGC 936',
]
galaxy_images = {}
for galaxy in FAMOUS_GALAXIES_LIST:
img = SkyView.get_images(galaxy,survey=['SDSSi'], pixels=250,)
original_img_data = img[0][0].data.copy()
galaxy_images[galaxy] = original_img_data
【问题讨论】:
-
你试过没有循环过滤的 OpenCV SimpleBlobDetector 吗?但是,他们仍然只会返回循环答案。也许您可以在仅使用检测器发现斑点的存在后更好地分割斑点,而不使用圆形作为形状?
-
你能发布一张或几张没有注释的星系图像吗?它将允许人们在提议之前尝试一种方法。
-
如果你能描述一下你在手动确定一个星系是什么/在哪里以及被其包围时应用的逻辑或想法,也许会有所帮助。这样可能更容易思考如何实现“手动”逻辑。另外,在你看来,星系是不规则的形状,还是可以用椭圆合理地近似?答案将在该方法中发挥重要作用。
-
IMO 认为这些星系完全有形状是一种错误的观点,因为它们正在平滑地融合到背景中。所以你需要声明一个规则来定义大纲。据我所知,您能做的最好的事情就是设置……密度阈值。
标签: python opencv image-processing scikit-image