我有星星的图像,像这样:
现在,我想获得100个最亮的星星,并将它们减少到四个数据点:1. X坐标,2. Y坐标,3.亮度,4.半径。而已。基本上,我想将这些800x480px = 384000数据点减少为100 * 4数据点,同时仍保留大多数信息(恒星位置,恒星亮度和恒星半径)。
我目前的方法是寻找最明亮的星星:
np.where(star_image_array**2 > threshold, 1, 0)
然后,对结果运行高斯滤波器,并对最大值进行另一个选择。但这仍然不能解决如何选择不同的星形坐标的问题(更不用说亮度和半径了)。有人可以为我指出解决该挑战的正确方向,还是为我提供一些资源?谢谢!
最佳答案
您可以使用轮廓在阈值图像中找到星星,如下所示:
ret, mask = cv2.threshold(img, 100, 255, cv2.CV_8U)
contours, hierarchy = cv2.findContours(mask, 1, 2)
stars = []
for cnt in contours:
area = cv2.contourArea(cnt)
if area < 2:
continue
x, y, w, h = cv2.boundingRect(cnt)
# 1. X-coordinate
x_coord = x + w/2.0
# 2. Y-coordinate
y_coord = y + h/2.0
# 3. brightness
star_mask = np.zeros(img.shape,np.uint8)
cv2.drawContours(star_mask, [cnt], 0, 255, -1)
mean_val = cv2.mean(img, mask=star_mask)[0]
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(img, mask=star_mask)
# 4. radius
radius = np.sqrt(area/(2*np.pi))
stars.append({'x': x_coord,
'y': y_coord,
'mean_brightness': mean_val,
'max_brightness': max_val,
'radius': radius})
有一个示例代码here的协作。关于numpy - 将恒星图像缩小为具有半径的恒星坐标(Numpy/OpenCV),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63079576/