如何用Python+OpenCV提取5×6共30个贴纸并优化阈值化效果
解决方案:优化阈值提取+批量切割贴纸
一、解决阈值化模糊与灰色残留问题
原始阈值化的问题多因光照不均+未做预处理导致,改用自适应阈值+预处理去噪可彻底解决:
- 先将图像转为灰度图,消除色彩干扰
- 用高斯模糊预处理,过滤细微噪点,避免文字边缘模糊
- 使用自适应阈值(根据局部区域亮度动态调整阈值),彻底去除灰色背景,同时保留清晰的文字边缘
二、批量切割为5行6列单张贴纸
因为贴纸是固定的5×6布局,直接计算单张贴纸的宽高,循环遍历每个位置切片即可:
- 获取预处理后图像的总宽高
- 计算单张贴纸宽度=总宽度÷6,高度=总高度÷5
- 嵌套循环遍历行(0-4)和列(0-5),截取对应区域并保存
完整代码实现
import cv2 import numpy as np # 读取原始图像(替换为你的本地路径) img = cv2.imread("ng7oV.jpg") # 转为灰度图 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 高斯模糊去噪,3×3核兼顾去噪与文字细节保留 blurred = cv2.GaussianBlur(gray, (3, 3), 0) # 自适应阈值处理:解决光照不均导致的灰色区域,反二值化保留白色贴纸背景 thresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) # 计算单张贴纸尺寸 rows, cols = thresh.shape sticker_width = cols // 6 sticker_height = rows // 5 # 批量切割并保存 for i in range(5): # 遍历5行 for j in range(6): # 遍历6列 # 计算当前贴纸的坐标范围 y_start = i * sticker_height y_end = y_start + sticker_height x_start = j * sticker_width x_end = x_start + sticker_width # 截取单张贴纸区域 sticker = thresh[y_start:y_end, x_start:x_end] # 保存文件(可自定义路径和命名规则) cv2.imwrite(f"sticker_row{i+1}_col{j+1}.png", sticker) # 可选:预览处理效果 cv2.imshow("Processed Threshold Image", thresh) cv2.imshow("Sample Sticker", sticker) cv2.waitKey(0) cv2.destroyAllWindows()
关键参数微调提示
- 高斯模糊核
(3,3):若噪点较多可改为(5,5),但会轻微损失文字细节 - 自适应阈值的
11(局部区域大小,必须为奇数)和2(阈值偏移量):若仍有灰色残留,可尝试增大11或减小2
内容的提问来源于stack exchange,提问作者user20384021
相关产品推荐
相关产品推荐

