获取二维数组中高于某个值的局部最大值的坐标
获取二维数组中高于某个值的局部最大值的坐标
from PIL import Image import numpy as np from scipy.ndimage.filters import maximum_filter import pylab # the picture (256 * 256 pixels) contains bright spots of which I wanna get positions # problem: data has high background around value 900 - 1000 im = Image.open('slice0000.png') data = np.array(im) # as far as I understand, data == maximum_filter gives True-value for pixels # being the brightest in their neighborhood (here 10 * 10 pixels) maxima = (data == maximum_filter(data,10)) # How can I get only maxima, outstanding the background a certain value, let's say 500 ?
我不太明白scipy.ndimage.filters.maximum_filter()
函数。是否有一种方法只获取斑点内的像素坐标而不包括背景?
http://i.stack.imgur.com/RImHW.png(16位灰度图像,256*256像素)
admin 更改状态以发布 2023年5月25日
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')
给定 data.png:
上述程序使用threshold = 1500
产生了result.png。降低threshold
以捕捉更多局部极值:
参考资料: