将恒星图像缩小为具有半径的恒星坐标(Numpy/OpenCV)

将恒星图像缩小为具有半径的恒星坐标(Numpy/OpenCV),numpy,opencv,image-processing,scipy,python-imaging-library,Numpy,Opencv,Image Processing,Scipy,Python Imaging Library,我有一张星星的照片,像这样: 现在,我想得到100颗最亮的恒星,并将它们分别减少到四个数据点:1。X坐标,2。Y坐标,3。亮度,4。半径就这样。基本上,我想将这些800x480px=384000数据点减少为100*4数据点,同时保留大部分信息(恒星位置、恒星亮度和恒星半径) 我目前的方法是寻找最亮的星星: np.where(star_image_array**2 > threshold, 1, 0) 然后我对结果运行一个高斯滤波器,并对最高值进行另一个选择。但这仍然不能解决如何选择不同

我有一张星星的照片,像这样:

现在,我想得到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})
ret,mask=cv2.阈值(img,100255,cv2.CV_8U)
轮廓,层次=cv2.findContours(掩码,1,2)
星星=[]
对于轮廓中的cnt:
面积=cv2。轮廓面积(cnt)
如果面积小于2:
持续
x、 y,w,h=cv2.boundingRect(cnt)
# 1. 横坐标
x_坐标=x+w/2.0
# 2. Y坐标
y_坐标=y+h/2.0
# 3. 亮度
星形遮罩=np.0(图像形状,np.uint8)
cv2.绘制轮廓(星型掩模,[cnt],0255,-1)
平均值=cv2。平均值(img,掩码=星形掩码)[0]
最小值,最大值,最小位置,最大位置=cv2。最小最大位置(img,掩码=星形掩码)
# 4. 半径
半径=np.sqrt(面积/(2*np.pi))
stars.append({'x':x_坐标,
“y”:y_coord,
“平均亮度”:平均值,
“最大亮度”:最大值,
“半径”:半径})
有一个带有示例代码的colab。

目前正在查看和,似乎有点相关,但仍在尝试找出答案。将保持更新。可能您希望使用