如何提升非高清影片片尾字幕的OCR识别精度?
提升电影片尾字幕OCR识别精度的方法
当前使用以下代码识别非高清电影片尾字幕时,即使调整psm模式,识别结果仍混乱,仅高清图效果较好,需适配非高清影片:
print(pytesseract.image_to_string(cv2.imread('frames/frame_144889.jpg')))
以下是具体优化方案:
图像预处理
- 灰度化:把彩色图转成灰度图,减少色彩干扰,代码示例:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - 二值化阈值:让文字和背景彻底分离,推荐用自适应阈值适配不同区域的亮度差异:
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2) - 降噪:用高斯模糊或中值滤波去除画面噪点,避免干扰识别:
blur = cv2.GaussianBlur(gray, (5,5), 0) - 放大图像:对非高清图进行插值放大,提升文字清晰度,比如放大2倍:
scaled = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_CUBIC)
- 灰度化:把彩色图转成灰度图,减少色彩干扰,代码示例:
优化Tesseract配置
- 指定英文语言:明确识别语言为英文,避免多语言识别干扰:
pytesseract.image_to_string(img, lang='eng') - 匹配字幕场景的psm模式:片尾字幕属于规整的文本块,优先试psm 6(假设文本为单一均匀块)或psm 11(稀疏文本):
pytesseract.image_to_string(img, config='--psm 6') - 限定字符集:如果字幕只有大写字母、空格和标点,直接限定识别范围,过滤无效字符:
pytesseract.image_to_string(img, config='--psm 6 -c tessedit_char_whitelist=ABCDEFGHIJKLMNOPQRSTUVWXYZ . ')
- 指定英文语言:明确识别语言为英文,避免多语言识别干扰:
裁剪字幕区域
- 片尾字幕大多集中在屏幕下方,先通过边缘检测、轮廓识别定位字幕区域,裁剪后再识别,减少无关背景的干扰。
训练自定义字体模型
- 如果目标影片的字幕字体风格固定,收集该字体的样本,训练Tesseract自定义语言模型,能大幅提升特定字体的识别准确率。
内容的提问来源于stack exchange,提问作者Quentin M
相关产品推荐
相关产品推荐

