我被要求编写一个程序,通过将图像文件转换为numpy数组并在指定阈值以上的图像中生成最亮像素坐标数组(表示背景干扰)来查找图像中的“星星” )。 一旦找到了图像中最亮的像素,我必须记录其x,y坐标,并将该像素的值和周围10X10像素区域设置为零,从而有效地从图像中移除星形。 我已经有一个帮助代码将图像转换为数组,并试图解决问题如下;
我定义了一个变量
Max = array.max()
并使用了while循环;
while Max >= threshold
coordinates = numpy.where(array == Max) # find the maximum value
但是我想让它遍历所有坐标的整个数组,不仅找到第一个最大值,还要在找到时删除每个最大值并将周围的10X10区域设置为零。我已经考虑过使用for循环来做这个,但我不确定如何使用它,因为我不熟悉Python。
我很感激任何建议, 感谢
答案 0 :(得分:2)
Astronomy.net会为您执行此操作:
如果你用天体坐标对天空进行天文成像 你不知道 - 或者不信任 - 那么Astrometry.net就是为你准备的。输入 一个图像,我们将返回天体测量校准元数据, 加上落在视野内的已知物体列表。
我们已经建立了这种天体测量校准服务来创建正确的, 每个有用的符合标准的天体测量元数据 任何状态下的天文图像,过去和未来 档案混乱。我们希望这有助于组织,注释和制作 搜索世界上所有的天文信息。
您甚至不必将图像上传到他们的网站。您可以下载source。它是根据GPL许可并使用NumPy,因此如果需要,您可以随身携带它。
请注意,您需要先将位图转换为以下之一:JPEG,GIF,PNG或FITS图像。
答案 1 :(得分:2)
有很多不同的方法可以用numpy等来实现。
蛮力""蛮力"方式:
import Image
import numpy as np
im = Image.open('test.bmp')
data = np.array(im)
threshold = 200
window = 5 # This is the "half" window...
ni, nj = data.shape
new_value = 0
for i, j in zip(*np.where(data > threshold)):
istart, istop = max(0, i-window), min(ni, i+window+1)
jstart, jstop = max(0, j-window), min(nj, j+window+1)
data[istart:istop, jstart:jstop] = new_value
或更快的方法......
import Image
import numpy as np
import scipy.ndimage
im = Image.open('test.bmp')
data = np.array(im)
threshold = 200
window = 10 # This is the "full" window...
new_value = 0
mask = data > threshold
mask = scipy.ndimage.uniform_filter(mask.astype(np.float), size=window)
mask = mask > 0
data[mask] = new_value