使用导数确定二维数组中局部最大值的坐标。
使用导数确定二维数组中局部最大值的坐标。
我有一张fits
图像,并试图找到图像中局部最大值的坐标,但到目前为止我还无法完全实现。可以在这里找到我的图像。\n我目前的进展如下:\n
import numpy as np import scipy.nimage as ndimage from astropy.wcs import WCS from astropy import units as u from astropy import coordinates as coord from astropy.io import fits import scipy.ndimage.filters as filters from scipy.ndimage.filters import maximum_filter hdulist=fits.open("MapSNR.fits") # 从fits文件中读取二维数组 d=hdulist[0].data w=WCS("MapSNR.fits") idx,idy=np.where(d==np.max(d)) rr,dd=w.all_pix2word(idx,idy,o) c=coord.SkyCoord(ra=rr*u.degree, dec=dd*u.degree) # 图像最大值的天球坐标 print c.ra print c.dec
\n这是我如何找到图像的全局最大值,但我想获得具有显著性大于三的局部最大值的坐标。\n我在网上找到的这个答案在我的情况下无法正常工作。\n更新:我使用了这个函数\n
def detect_peaks(data, threshold=1.5, neighborhood_size=5): data_max = filters.maximum_filter(data, neighborhood_size) maxima = (data == data_max) data_min = filters.minimum_filter(data, neighborhood_size) diff = ((data_max - data_min) > threshold) maxima[diff == 0] = 0 # 将小于等于阈值的值设置为背景 labeled, num_objects = ndimage.label(maxima) slices = ndimage.find_objects(labeled) x,y=[],[] for dy,dx in slices: x_center = (dx.start + dx.stop - 1)/2 y_center = (dy.start + dy.stop - 1)/2 x.append(x_center) y.append(y_center) return x,y
\n我想找到一种使用更好方法(如数组的导数或分而治之的方法)的方法。我会感激一个更好的推荐解决方案。
在一个二维数组中确定局部极大值点的坐标,这是一个常见的问题。为了解决这个问题,可以使用derivatives(导数)的方法。
在这个问题中,可以使用photutils.detection.find_peaks函数,这是photutils检测方法之一。通过查看photutils.detection.find_peaks的实现,可以看到它使用scipy.ndimage.maximum_filter来计算一个最大化的图像(默认为3x3的盒子大小),并找到原始图像等于最大化图像的像素点。
除了寻找局部极大值点的功能外,该函数的其余部分还有两个对你可能也有兴趣的功能:
1. 如果传入了wcs对象,可以获得天文坐标而不仅仅是像素坐标。
2. 有一个选项可以获得亚像素精度的坐标。
那么如何将天文坐标传递给这个函数呢?
在这个问题中,我们需要确定二维数组中局部极大值的坐标。根据给定的代码和输出结果,我们可以得出以下结论。
问题的出现原因:
1. 需要确定二维数组中局部极大值的坐标。
2. 通过使用skimage自适应阈值方法进行图像处理,可以得到二值化的图像。
3. 对二值化图像进行标记和测量,可以找到局部极大值的坐标。
解决方法:
1. 导入必要的库:从skimage.filters导入threshold_adaptive方法,从matplotlib.pyplot导入plt,从scipy.misc和scipy.ndimage导入misc、ndimage模块,从numpy导入np。
2. 读取图像:使用misc.imread读取图像,并将其赋值给变量im。
3. 应用阈值:使用threshold_adaptive方法对im进行二值化处理,设置block_size为40,offset为-20,并将结果转换为整型,赋值给变量binary_adaptive。
4. 标记和测量:使用ndimage.label对二值化图像进行标记,并将结果赋值给变量lbl。然后,使用ndimage.measurements.center_of_mass方法计算二值化图像中每个标记区域的质心坐标,并将结果赋值给变量points。
5. 更新坐标:遍历points中的每个坐标,将其转换为整型,并在binary_adaptive中对应的位置上加上5。
6. 显示图像:使用plt.imshow方法显示原始图像和二值化图像,分别使用灰度插值和灰度色彩映射。
7. 输出结果:根据给定的代码和参数,可以得到包含局部极大值的坐标的二值化图像。
通过改变阈值的参数,可以对局部极大值的位置和数量产生较大影响。在阈值处理之前使用高斯滤波器也可以在一定程度上改善该方法的效果。