如何从一维信号中提取局部最大值?二进制图像信号处理场景
从一维信号中提取局部最大值的解决方案
针对你从二进制图像生成的一维信号count_non_zero,可以使用scipy.signal.find_peaks精准定位局部峰值,以下是具体实现步骤:
完整代码示例
import cv2 import numpy as np import matplotlib.pyplot as plt from scipy.signal import find_peaks # 原图像处理代码 pic = cv2.imread("img.png") pic = pic[:,:,0] # 取单通道 count_non_zero = np.sum(pic==255, axis = 1) # 寻找局部峰值 # 参数说明: # - height: 设定峰值最小高度,过滤低幅值噪声 # - distance: 设定峰值间最小距离,避免相邻过近的峰被重复识别 peaks, peak_properties = find_peaks(count_non_zero, height=0, distance=5) # 筛选590~600区间内的峰值 target_peaks = peaks[(peaks >= 590) & (peaks <= 600)] peak_heights = peak_properties['peak_heights'][(peaks >= 590) & (peaks <= 600)] # 输出结果 print("590~600区间内的峰值对应的行数(X轴):", target_peaks) print("对应峰值的列数(Y轴):", peak_heights) # 可视化验证 plt.plot(count_non_zero) plt.scatter(target_peaks, peak_heights, color='black', marker='x') plt.show()
关键说明
find_peaks返回的peaks数组是峰值对应的行数索引(即X轴数值),peak_properties['peak_heights']是对应的列数计数(即Y轴数值)。- 可根据你的实际信号调整
height和distance参数:如果峰值周围有小噪声峰,提高height阈值;如果峰值间距较近,减小distance值。 - 筛选区间时使用numpy的布尔索引,精准锁定590到600之间的峰值。
内容的提问来源于stack exchange,提问作者Issac Boera
相关产品推荐
相关产品推荐

