Python 获取二维数组中高于某个值的局部极大值的坐标

Python 获取二维数组中高于某个值的局部极大值的坐标,python,image,numpy,scipy,Python,Image,Numpy,Scipy,恐怕我不太懂scipy.ndimage.filters.maximum_filter()函数。是否有一种方法可以仅在点内而不在背景内获得像素坐标 (16位灰度图像,256*256像素) 给定data.png: 上面的程序生成结果.png,其中阈值=1500。降低阈值以获取更多的局部最大值: 参考资料: 前面的条目对我非常有用,但是for循环减慢了我的应用程序。我发现ndimage.center\u of_mass()可以快速获得坐标。。。因此,这项建议。现在可以通过撇渣来实现 imp

恐怕我不太懂
scipy.ndimage.filters.maximum_filter()
函数。是否有一种方法可以仅在点内而不在背景内获得像素坐标

(16位灰度图像,256*256像素)

给定data.png

上面的程序生成结果.png,其中
阈值=1500
。降低
阈值
以获取更多的局部最大值:

参考资料


前面的条目对我非常有用,但是for循环减慢了我的应用程序。我发现ndimage.center\u of_mass()可以快速获得坐标。。。因此,这项建议。

现在可以通过撇渣来实现

import numpy as np
import scipy
import scipy.ndimage as ndimage
import scipy.ndimage.filters as filters
import matplotlib.pyplot as plt

fname = '/tmp/slice0000.png'
neighborhood_size = 5
threshold = 1500

data = scipy.misc.imread(fname)

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)
xy = np.array(ndimage.center_of_mass(data, labeled, range(1, num_objects+1)))

plt.imshow(data)
plt.savefig('/tmp/data.png', bbox_inches = 'tight')

plt.autoscale(False)
plt.plot(xy[:, 1], xy[:, 0], 'ro')
plt.savefig('/tmp/result.png', bbox_inches = 'tight')

在我的计算机上,对于VGA图像大小,它的运行速度大约是上述解决方案的4倍,并且在某些情况下还返回了更精确的位置

你好,unutbu,恐怕我没有真正了解您的解决方案,即输出。目前,我设法剔除了所有绝对值小于1500的最大值。我只是想看看结果是否令人满意。很可能是我不明白你的问题。您是否正在寻找一种方法来找到最大值的
(x,y)
坐标?如果是这样,您可以使用
np.where(maxima)
找到它们。您是对的。但我想摆脱背景中的局部极大值。比如说:局部极大值只是局部极大值,如果它从它的邻域中突出超过某个值。目前,我通过将值低于1500的所有像素设置为零来取消背景,但我对此并不满意。你认识ImageJ吗?“Find Maxima”函数做得很好,我想重现这个输出。要明确的是:我想有最亮的像素在图片上的亮点的坐标。感谢这一改进!下面是
skimage
中查找图像中“斑点”的一个很好的示例/教程:
import numpy as np
import scipy
import scipy.ndimage as ndimage
import scipy.ndimage.filters as filters
import matplotlib.pyplot as plt

fname = '/tmp/slice0000.png'
neighborhood_size = 5
threshold = 1500

data = scipy.misc.imread(fname)

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
    x.append(x_center)
    y_center = (dy.start + dy.stop - 1)/2    
    y.append(y_center)

plt.imshow(data)
plt.savefig('/tmp/data.png', bbox_inches = 'tight')

plt.autoscale(False)
plt.plot(x,y, 'ro')
plt.savefig('/tmp/result.png', bbox_inches = 'tight')
import numpy as np
import scipy
import scipy.ndimage as ndimage
import scipy.ndimage.filters as filters
import matplotlib.pyplot as plt

fname = '/tmp/slice0000.png'
neighborhood_size = 5
threshold = 1500

data = scipy.misc.imread(fname)

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)
xy = np.array(ndimage.center_of_mass(data, labeled, range(1, num_objects+1)))

plt.imshow(data)
plt.savefig('/tmp/data.png', bbox_inches = 'tight')

plt.autoscale(False)
plt.plot(xy[:, 1], xy[:, 0], 'ro')
plt.savefig('/tmp/result.png', bbox_inches = 'tight')
from skimage.feature import peak_local_max
xy = peak_local_max(data, min_distance=2,threshold_abs=1500)