如何简化ECG样本图像的二值化流程?Python+OpenCV优化
简洁版ECG图像二值化实现
针对你提供的ECG图像,这里有更简洁的二值化实现方案,既能匹配目标效果,又能消除原代码中的重复冗余步骤:
优化后代码
import cv2 import numpy as np # 加载图像并转灰度 img = cv2.imread('src.png') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊去除噪声 blurred = cv2.GaussianBlur(gray, (3, 3), 0) # **自适应阈值处理**——替代多次固定阈值,自动适配局部区域差异 thresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 形态学闭操作修复波形断裂,清除小噪点 kernel = np.ones((3, 3), np.uint8) final_result = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
优化思路说明
- 替换多次固定阈值为自适应阈值:原代码反复执行模糊+固定阈值操作,手动调试多个阈值参数效率低。自适应阈值会根据每个像素的局部邻域计算阈值,能更好地处理ECG图中网格线与波形的明暗差异,一步到位替代多次重复操作。
- 精简流程:仅保留必要的噪声去除、阈值分割和形态学修复步骤,去掉无意义的重复模糊+阈值操作,代码更易读、维护性更强。
- 核心效果一致:高斯模糊过滤高频噪声,形态学闭操作填补波形的细小断裂,最终输出的二值化图与目标效果匹配。
可选:封装复用函数
如果后续需要处理同类型图像,可将模糊+阈值的逻辑封装成函数,便于复用:
def adaptive_threshold_process(img, blur_size=(3,3), block_size=11, c_value=2): blurred = cv2.GaussianBlur(img, blur_size, 0) return cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, block_size, c_value) # 使用示例 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) thresh_img = adaptive_threshold_process(gray) final_result = cv2.morphologyEx(thresh_img, cv2.MORPH_CLOSE, np.ones((3,3), np.uint8))
内容的提问来源于stack exchange,提问作者noobstacker
相关产品推荐
相关产品推荐

