我有星星的图像,像这样:

现在,我想获得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/

10-12 20:21