二维NumPy数组沿y轴将局部极大值置255其余置0的实现方法
二维NumPy数组沿指定轴检测局部极值并二值化实现
核心思路
- 利用
scipy.signal.argrelextrema指定检测轴和比较规则,获取极值点的索引 - 构建同形状的布尔掩码标记极值位置,传入
np.where完成值替换:极值位置设为255,其余位置设为0
说明
你给出的示例效果实际是沿水平方向(axis=1,逐行)同时检测局部极大值、局部极小值得到的结果,和描述中“沿y轴检测局部极大值”的规则有偏差,以下代码先匹配示例输出,你可以根据实际需求调整轴参数和比较规则。
实现代码
import numpy as np from scipy.signal import argrelextrema # 输入数组 input_arr = np.array([ [-33, -57, -77, -83, -70, -42, -5, 45, 107, 160, 183, 172], [-35, -60, -80, -85, -70, -42, -4, 46, 106, 160, 183, 172], [-36, -64, -84, -88, -72, -41, -4, 45, 105, 158, 181, 173] ]) # 初始化全False的掩码 extrema_mask = np.zeros_like(input_arr, dtype=bool) # 检测局部极大值(比相邻点大,比较函数用np.greater),沿axis=1逐行检测 max_idx = argrelextrema(input_arr, np.greater, axis=1) extrema_mask[max_idx] = True # 检测局部极小值(比相邻点小,比较函数用np.less),不需要可删除这两行 min_idx = argrelextrema(input_arr, np.less, axis=1) extrema_mask[min_idx] = True # 替换值得到结果 output = np.where(extrema_mask, 255, 0)
运行结果
执行后得到的output和期望输出完全一致:
array([[ 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 255, 0], [ 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 255, 0], [ 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 255, 0]])
参数调整说明
- 若要沿y轴(垂直方向,逐列)检测,将
argrelextrema的axis参数改为0即可,注意边界行(第一行、最后一行)无上下邻点,不会被判定为极值 - 若只需要检测局部极大值,删除极小值检测的两行代码即可
- 可通过
argrelextrema的order参数调整极值判定的邻域宽度,默认值为1,即仅和直接相邻的点比较
内容的提问来源于stack exchange,提问作者Howisitgoing
相关产品推荐
相关产品推荐

