查找图像中最亮像素的坐标并存入数组
我被要求写一个程序,来在一张图片中找到“星星”。这个过程是先把图片文件转换成一个numpy数组,然后生成一个数组,记录那些亮度超过指定阈值的像素坐标(这个阈值是用来过滤背景干扰的)。
一旦我找到了图片中最亮的像素,我需要记录下它的x和y坐标,并把这个像素以及周围10x10像素的区域的值都设为零,这样就能有效地把这个星星从图片中去掉。
我已经有了一段辅助代码,可以把图片转换成数组,并且尝试用以下方法来解决这个问题;
我定义了一个变量
Max = array.max()
并使用了一个while循环;
while Max >= threshold
coordinates = numpy.where(array == Max) # find the maximum value
但是我希望这个循环能够遍历整个数组,找到所有的坐标,而不仅仅是找到第一个最大值。同时,在找到每个最大值后,也要把它和周围的10x10区域都设为零。我考虑过用for循环来实现这个功能,但由于我对Python还不太熟悉,所以不太确定该怎么用。
我会很感激任何建议,感谢!
2 个回答
2
Astronomy.net 可以帮你完成这个任务:
如果你有天文图像,但不知道或者不太相信它的天体坐标,那么Astrometry.net就是为你准备的。你只需输入一张图片,我们会给你返回天文校准的元数据,还会列出在视野范围内的已知天体。
我们建立了这个天文校准服务,目的是为每一张有用的天文图像(无论是过去的还是未来的,不管它们的存档状态如何)创建正确的、符合标准的天文元数据。我们希望这能帮助整理、注释并让全世界的天文信息变得可搜索。
你甚至不需要把图片上传到他们的网站。你可以下载源代码。这个项目是GPL许可的,并且使用了NumPy,所以如果你需要的话,可以随意修改。
请注意,你需要先把你的位图转换成以下格式之一:JPEG、GIF、PNG或FITS格式的图片。
3
有很多种方法可以仅用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