基于MNIST的CNN模型数字图像鲁棒分割技术及代码需求
统一数字序列图像分割方案(适配彩色/二值图)
核心处理逻辑
先将所有输入图像归一化为灰度图,通过自适应阈值消除阴影与光照不均,再用形态学操作去除噪声,最后通过轮廓检测提取单个数字。整套流程无需区分彩色/二值图,实现统一处理。
分步操作说明
- 灰度归一化:无论输入是RGB彩色图还是二值图,先转为单通道灰度图,统一后续处理链路。
- 自适应阈值去阴影:用高斯自适应阈值替代全局阈值,能在保留数字细节的同时,有效抵消图像中的阴影和光照差异,生成干净的二值图。
- 形态学去噪:通过开运算(先腐蚀后膨胀)过滤小噪声点,同时规整数字边缘。
- 轮廓检测与分割:提取图像中外围轮廓,过滤面积过小的噪声轮廓,按水平坐标排序保证数字顺序,最后截取每个数字区域并调整为MNIST模型要求的28x28尺寸。
实现代码(Python+OpenCV)
import cv2 import numpy as np def process_and_split_digits(image_path): # 读取图像并统一转灰度 img = cv2.imread(image_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) if len(img.shape) == 3 else img # 自适应阈值处理,消除阴影 thresh_img = cv2.adaptiveThreshold( gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 4 ) # 形态学开运算去噪 kernel = np.ones((2, 2), np.uint8) cleaned_img = cv2.morphologyEx(thresh_img, cv2.MORPH_OPEN, kernel, iterations=1) # 提取并筛选轮廓 contours, _ = cv2.findContours(cleaned_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) valid_contours = sorted( [cnt for cnt in contours if cv2.contourArea(cnt) > 50], key=lambda x: cv2.boundingRect(x)[0] ) # 分割数字并转为MNIST格式 digit_list = [] padding = 5 for cnt in valid_contours: x, y, w, h = cv2.boundingRect(cnt) # 给数字添加 padding,避免边缘截断 x = max(0, x - padding) y = max(0, y - padding) w += 2 * padding h += 2 * padding digit = cleaned_img[y:y+h, x:x+w] # 调整为28x28尺寸,保持宽高比避免拉伸 digit = cv2.resize(digit, (28, 28), interpolation=cv2.INTER_AREA) # 统一为MNIST黑底白字格式 digit = 255 - digit if np.mean(digit) > 127 else digit digit_list.append(digit) return digit_list # 测试示例 if __name__ == "__main__": # 替换为你的图像路径,彩色/二值图均可 digits = process_and_split_digits("digit_sequence.png") # 遍历分割结果,可直接输入CNN模型预测 for idx, digit in enumerate(digits): cv2.imshow(f"分割数字 {idx+1}", digit) cv2.waitKey(0) cv2.destroyAllWindows()
参数调整提示
- 自适应阈值的
blockSize(需为奇数)和C:阴影严重时可增大blockSize,调整C控制阈值偏移量; - 形态学核尺寸:噪声较多时可适当调大
kernel; - 轮廓面积阈值:根据图像中数字的实际大小调整,过滤无效噪声轮廓;
- padding值:避免数字边缘被截断,保证分割完整性。
内容的提问来源于stack exchange,提问作者Cielo
相关产品推荐
相关产品推荐

