如何用OpenCV修复车牌OCR预处理中的褪色字符?
车牌OCR预处理:修复褪色字符的通用方案
针对车牌OCR预处理中遇到的字符褪色、常规膨胀操作损伤清晰字符的问题,这里提供一套兼顾清晰字符保护与褪色字符修复的通用预处理方案,核心思路是通过局部对比度增强+针对性形态学操作替代单纯的阈值与膨胀:
问题分析
你当前的代码依赖自适应阈值处理,但对于低对比度的褪色字符,阈值化后容易丢失字符细节;而直接使用膨胀会无差别扩大所有字符边缘,破坏原本清晰的字符结构。
改进后的预处理代码
import cv2 import numpy as np def image_preprocessing(image_path): # 读取图像并放大(保留原步骤,提升后续处理精度) img = cv2.imread(image_path) height, width, _ = img.shape img = cv2.resize(img, (width*6, height*6), interpolation=cv2.INTER_LINEAR) # 转灰度+局部对比度增强(解决褪色字符对比度低的问题) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) enhanced_gray = clahe.apply(gray) # 自适应阈值化(保留局部细节) thresh = cv2.adaptiveThreshold(enhanced_gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 21, 3) thresh = cv2.bitwise_not(thresh) # 针对性形态学操作:闭运算填充褪色字符的缺口,同时避免过度膨胀 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2)) closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel) # 缩小回原尺寸+模糊降噪 result = cv2.resize(closed, (width, height), interpolation=cv2.INTER_AREA) result = cv2.GaussianBlur(result, (3,3), 0) return result
关键步骤说明
- CLAHE局部对比度增强:相比普通灰度化,它能在不提亮背景的前提下,增强褪色字符的局部对比度,让模糊的字符边缘更清晰。
- 闭运算替代单纯膨胀:闭运算先膨胀后腐蚀,既能填充褪色字符的细小缺口,又能让膨胀后的字符边缘恢复到接近原尺寸,避免破坏清晰字符的轮廓。
- 自适应阈值优化:改用高斯加权的自适应阈值,对光照不均的车牌鲁棒性更强。
效果对比(基于你的示例)
效果良好的场景
输入:
输出:经过改进后,原清晰字符的边缘不会被过度破坏,保留完整细节。
效果不佳的褪色场景
输入:
输出:褪色的字符缺口会被闭运算填充,字符轮廓更完整,更适合OCR识别。
额外建议
如果部分车牌存在严重的污渍或背景干扰,可以在CLAHE后增加一步顶帽运算(cv2.morphologyEx(enhanced_gray, cv2.MORPH_TOPHAT, kernel)),进一步突出亮字符与暗背景的差异。
内容的提问来源于stack exchange,提问作者pydoni
相关产品推荐
相关产品推荐

