15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Python] スクショ→範囲選択→OCR→翻訳

Last updated at Posted at 2021-08-30

#緒言
PDFや画像中の英文をさくっと翻訳したかった。

#コード全体
↓の記事をかなり参考にさせていただきました(ありがてえです)。
範囲指定に関してはこちらの記事参照ください。

area_translator.py
import os
import tkinter
from tkinter import messagebox
import pyautogui
from PIL import Image, ImageTk, ImageEnhance, ImageOps
import pyocr
import pyocr.builders
from googletrans import Translator
import re

RESIZE_RETIO = 1.5

# Tesseractのパスを通す
path_tesseract = "C:\Program Files\Tesseract-OCR"
if path_tesseract not in os.environ["PATH"].split(os.pathsep):
    os.environ["PATH"] += os.pathsep + path_tesseract
# OCRエンジンの取得
tools = pyocr.get_available_tools()
tool = tools[0]

# ドラッグ開始時の処理
def start(event):
    global start_x, start_y 
    canvas.delete("rect") 
    canvas.create_rectangle(event.x, event.y, event.x + 1, event.y + 1,
                             outline="red", tag="rect")
    start_x, start_y = event.x, event.y

# ドラッグ中の処理
def drag(event):
    if event.x < 0:
        end_x = 0
    else:
        end_x = min(img_resized.width, event.x)
    if event.y < 0:
        end_y = 0
    else:
        end_y = min(img_resized.height, event.y)

    canvas.coords("rect", start_x, start_y, end_x, end_y)

# ドラッグ終了時の処理
def release(event):
    start_x, start_y, end_x, end_y = [round(n * RESIZE_RETIO) for n in canvas.coords("rect")]
    #指定範囲でトリミング
    img_region = img.crop((start_x, start_y, end_x, end_y))
    #画像を読みやすいように加工。
    img_rgb = img_region.convert('RGB')
    #反転フラグ取得
    wb_flg = bln.get()
    
    if wb_flg: #チェックされている場合(背景黒)
        img_rgb2 = ImageOps.invert(img_rgb) 
    else:
        #画像を読みやすいように加工
        con_img = ImageEnhance.Contrast(img_rgb)
        img_rgb = con_img.enhance(2.0)
        imsize = img_rgb.size
        img_rgb2 = Image.new('RGB', imsize)

        border=200
        
        for x in range(imsize[0]):
            for y in range(imsize[1]):
                r,g,b=img_rgb.getpixel((x,y))
                if r > border or g > border or b > border:
                    r = 255
                    g = 255
                    b = 255
                img_rgb2.putpixel((x,y),(r,g,b))
    #OCR
    builder = pyocr.builders.TextBuilder()#tesseract_layout=6)
    txt = tool.image_to_string(img_rgb2, lang='eng', builder=builder)
    
    #改行を無くす処理
    txt = re.sub(r'\n',' ',txt)
    messagebox.showinfo(u'OCR結果',txt) #確認用

    #翻訳機
    translator = Translator()
    translated = translator.translate(txt, src='en', dest='ja')
    txt = translated.text
    messagebox.showinfo(u'翻訳機',txt)

#スクショ更新用
def draw_image():
    global img, img_tk
    img = pyautogui.screenshot()
    img_resized = img.resize(size=(int(img.width / RESIZE_RETIO),
                                   int(img.height / RESIZE_RETIO)),
                             resample=Image.BILINEAR)
    img_tk = ImageTk.PhotoImage(img_resized)
    canvas.itemconfig(item, image=img_tk) 

# メイン処理 
if __name__ == "__main__":
    img = pyautogui.screenshot()
    img_resized = img.resize(size=(int(img.width / RESIZE_RETIO), 
                                   int(img.height / RESIZE_RETIO)),
                             resample=Image.BILINEAR)
    root = tkinter.Tk()
    img_tk = ImageTk.PhotoImage(img_resized) 
    canvas = tkinter.Canvas(root, 
                            bg="black", 
                            width=img_resized.width,
                            height=img_resized.height)
    item = canvas.create_image(0, 0, image=img_tk, anchor=tkinter.NW)

    #反転フラグボタン
    bln = tkinter.BooleanVar()
    bln.set(False)
    chk = tkinter.Checkbutton(root, variable=bln, text = u'背景黒')
    chk.pack(expand=True, side='bottom')

    #スクショ更新ボタン
    buttontext = tkinter.StringVar()
    buttontext.set(u"スクショ更新")
    button = tkinter.Button(root, textvariable=buttontext, command=draw_image)
    button.pack(expand=True, side='bottom')

    canvas.pack()
    canvas.bind("<ButtonPress-1>", start)
    canvas.bind("<Button1-Motion>", drag)
    canvas.bind("<ButtonRelease-1>", release)

    root.mainloop()

#内容
###OCR
※Tesseractのインストールが必要です
↓を参考にしました。

###翻訳
googletransのエラーで詰まりましたが、googletrans==4.0.0-rc1のインストールで動きました。
プロキシ設定する場合は↓でいけました

translator = Translator(proxies={'http://hogehoge'})

#結言
ちゃんと英語勉強したほうがいいのかもしれません。

15
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?