Python中如何实现美漫自动汉化器?

Python + OpenCV 写的简易工具。 https://zhuanlan.zhihu.com/p/56145616


Python中如何实现美漫自动汉化器?
9 回复

赞一个~ 不过感觉可以再加上自动学习做到自动切框,毕竟对话框的特征还是比较明显的。


要实现一个美漫自动汉化器,核心是结合OCR(文字识别)和NLP(自然语言处理)技术。这里给你一个基于pytesseractgoogletrans的简化版实现思路和关键代码。

核心步骤:

  1. 图片预处理:提高OCR识别准确率。
  2. 文字检测与识别:定位漫画中的文字区域并提取英文文本。
  3. 文本翻译:将英文翻译成中文。
  4. 文字渲染与替换:将翻译后的中文文本重新嵌入到原图片的对应位置。

关键代码示例:

import cv2
import pytesseract
from googletrans import Translator
from PIL import Image, ImageDraw, ImageFont
import numpy as np

def preprocess_image(image_path):
    """预处理:转灰度、二值化、去噪"""
    img = cv2.imread(image_path)
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    _, binary = cv2.threshold(gray, 150, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    denoised = cv2.medianBlur(binary, 3)
    return denoised

def extract_and_translate_text(image):
    """提取文本并翻译"""
    # 使用Tesseract进行OCR
    custom_config = r'--oem 3 --psm 6'
    text_data = pytesseract.image_to_data(image, output_type=pytesseract.Output.DICT, config=custom_config)
    
    translator = Translator()
    translated_texts = []
    
    for i, text in enumerate(text_data['text']):
        if text.strip():
            try:
                # 翻译文本(注意免费API有频率限制)
                translated = translator.translate(text, src='en', dest='zh-cn').text
                translated_texts.append({
                    'text': translated,
                    'left': text_data['left'][i],
                    'top': text_data['top'][i],
                    'width': text_data['width'][i],
                    'height': text_data['height'][i]
                })
            except Exception as e:
                translated_texts.append({
                    'text': text,
                    'left': text_data['left'][i],
                    'top': text_data['top'][i],
                    'width': text_data['width'][i],
                    'height': text_data['height'][i]
                })
    
    return translated_texts

def render_text_on_image(original_path, text_blocks):
    """将翻译后的文本渲染到图片上"""
    img_pil = Image.open(original_path).convert("RGB")
    draw = ImageDraw.Draw(img_pil)
    
    # 加载中文字体(确保字体文件存在)
    try:
        font = ImageFont.truetype("simhei.ttf", size=20)
    except:
        font = ImageFont.load_default()
    
    for block in text_blocks:
        # 在原文字区域绘制白色背景
        draw.rectangle(
            [block['left'], block['top'], 
             block['left'] + block['width'], 
             block['top'] + block['height']],
            fill=(255, 255, 255)
        )
        # 绘制中文文本
        draw.text((block['left'], block['top']), 
                  block['text'], 
                  font=font, 
                  fill=(0, 0, 0))
    
    return img_pil

# 主流程
def comic_translator(image_path, output_path):
    processed_img = preprocess_image(image_path)
    text_blocks = extract_and_translate_text(processed_img)
    result_image = render_text_on_image(image_path, text_blocks)
    result_image.save(output_path)
    print(f"处理完成,结果保存至:{output_path}")

# 使用示例
comic_translator("input_comic.jpg", "output_comic.jpg")

需要安装的库:

pip install opencv-python pillow pytesseract googletrans==4.0.0rc1
# 还需要安装Tesseract OCR引擎:https://github.com/tesseract-ocr/tesseract

几个关键点:

  1. 字体处理:中文字体需要单独加载,确保simhei.ttf字体文件存在或替换为其他中文字体。
  2. 文字区域检测:这里直接使用Tesseract的文本位置信息。对于复杂版面,可能需要先用目标检测(如YOLO)定位文字框。
  3. 翻译API限制googletrans是免费库但有频率限制。生产环境建议使用付费API(如Google Cloud Translation)。
  4. 文本渲染优化:中文排版可能需要调整字体大小和位置,特别是对于竖排或艺术字。

一句话建议: 对于复杂漫画版面,建议结合深度学习模型(如Mask R-CNN)进行更精确的文字区域检测。

很棒!赞一个

做了分水岭切割,细线就是机切。并不能每次都识别对,还会有多切和错切同样要手动调整。

牛 X er~

很有用感觉

厉害… 求源码学习一波。

回到顶部