OpenCV实现图像峰值检测与定位:自动识别红色点坐标
解决OpenCV自动检测曲线峰值并标记的方案
思路分析
你的需求是检测蓝色曲线的峰值(最顶端的点),模板匹配不适用是因为它需要固定模板,我们可以直接通过图像分析定位极值点:
- 提取图像中的蓝色曲线区域
- 在曲线区域中找到纵向坐标最小的点(图像坐标系y轴向下,y值越小位置越靠上,对应曲线峰值)
- 在原图上标记红色点
完整代码
import cv2 import numpy as np # 读取输入图像 img = cv2.imread('z4OvN.png') # 复制原图用于绘制标记 result_img = img.copy() # 转灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 二值化提取蓝色曲线(背景白色灰度高,曲线蓝色灰度低,取小于240的区域) _, binary = cv2.threshold(gray, 240, 255, cv2.THRESH_BINARY_INV) # 找到所有曲线像素的坐标 y_coords, x_coords = np.where(binary == 255) # 找到y坐标最小的点(对应曲线最顶端,即峰值) min_y_idx = np.argmin(y_coords) peak_x = x_coords[min_y_idx] peak_y = y_coords[min_y_idx] # 在原图上绘制红色圆点(半径5,厚度-1填充) cv2.circle(result_img, (peak_x, peak_y), 5, (0, 0, 255), -1) # 保存结果或显示 cv2.imwrite('peak_marked.png', result_img) cv2.imshow('Peak Marked', result_img) cv2.waitKey(0) cv2.destroyAllWindows()
代码说明
- 图像预处理:转灰度图后用二值化提取曲线,
240是适配当前图像的阈值,背景白色灰度接近255,蓝色曲线灰度更低,THRESH_BINARY_INV会把曲线区域转为白色、背景转为黑色,方便后续提取坐标。 - 定位峰值:通过
np.where获取所有曲线像素的坐标,找到y坐标最小的点,就是曲线的峰值位置。 - 标记峰值:用
cv2.circle绘制红色实心圆点完成标记。
注意事项
- 如果图像背景或曲线颜色有变化,可调整二值化的阈值(
240),确保准确提取曲线区域。 - 若存在多个局部峰值,可按x轴分段,分别查找每段的最小y值点来定位多个峰值。
内容的提问来源于stack exchange,提问作者newTOcode
相关产品推荐
相关产品推荐

