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.png,阈值为1500.降低阈值以获取更多的局部最大值:
参考文献:
import numpy as npimport scipyimport scipy.ndimage as ndimageimport scipy.ndimage.filters as filtersimport matplotlib.pyplot as pltfname = '/tmp/slice0000.png'neighborhood_size = 5threshold = 1500data...
简单,快速的
2D
峰
值
查找器。 目的是要比更复杂的技术更快,但又足以在嘈杂的数据中找到峰
值
。 该代码分析嘈杂的
2D
图像,并使用鲁棒的
局部
最大值
查找器(1像素分辨率)或加权质心(子像素分辨率)查找峰
值
。 该代码被设计为尽可能快,因此我将其保持为基本。 当使用uint16 \ uint8图像时,它最好工作,并假定峰
值
相对稀疏。
该代码需要Matlab的“图像处理工具箱”,并且可以在parfor中使用,以加快处理速度。
请引用为:
纳坦(2021)。 快速
2D
峰查找器( https://www.mathworks.com/matlabcentral/fileexchange/37388-fast-
2d
-peak-finder),MATLAB中央文件交换。 检索2021年5月26日
代码的工作原理:从理论上讲,每个峰都是一个平滑点扩展函数(SPF),例如某种大小的高斯等。
给定M行N列的整数
矩阵
A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是
矩阵
的
局部
极大值
。本题要
求
给定
矩阵
的全部
局部
极大值
及其所在的位置。
输入格式:
输入在第一行中给出
矩阵
A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的
值
。数字间以空格分隔。
输出格式:
每行按照“元素
值
行号 列号”的格式输出一个
局部
极大值
,其中行、列编号从1开始。要
求
按照行号递增输出;若同行有
超过
1个
局部
极大值
,则该行按列号递增输出。若没有
局部
极大值
,则输出“No
Description:给定M行N列的整数
矩阵
A,如果A的非边界元素A[i][j]大于相邻的上下左右4个元素,那么就称元素A[i][j]是
矩阵
的
局部
极大值
。本题要
求
给定
矩阵
的全部
局部
极大值
及其所在的位置。
Input:输入在第一行中给出
矩阵
A的行数M和列数N(3≤M,N≤20);最后M行,每行给出A在该行的N个元素的
值
。数字间以空格分隔。
Output:每行按照“元素
值
行号 列号”的格式输出一个...
rows,lines = map(int,input().split())
grid = [[] for i in range(rows)]
for i in range(rows):
line = list(input().split())
for j in range(lines):
grid[i].append(int(line[j]))
flag = 0
for i in range(rows):
if(i!=0 and i!=row
# 遍历
矩阵
for i in range(, rows - window_size + 1, stride):
for j in range(, cols - window_size + 1, stride):
#
获取
当前窗口内的子
矩阵
window = matrix[i:i+window_size, j:j+window_size]
# 判断子
矩阵
是否为
局部
最大值
if np.all(window == np.max(window)):
# 记录
局部
最大值
的
坐标
max_positions.append((i+window_size//2, j+window_size//2))
return max_positions
调用该函数,可以得到二维
矩阵
的
局部
最大值
的
坐标
列表。