이미지에서 텍스트 추출
14631 단어 Python
친구와 PDF가 보낸 과제의 자동화에 대해 이야기하거나 다른 친구의 보고서를 워드에 넣으면 OCR을 사용하는 것이 편하다. OCR로 프로그램을 써 보는 것이 계기다.
액션
Tkinter.filedialog.askopenfilenames를 사용하여 PDF 및 JPG 파일을 선택합니다.
파일은 여러 개를 동시에 선택할 수 있습니다.
PDF에서 OCR을 직접 수행할 수 없기 때문에 먼저 이미지로 변환합니다.
poppler와 pdf2imge를 사용합니다.
PDF 변환된 이미지와 1에서 선택한 이미지에서 텍스트를 추출합니다.
tesseract와 PyOCR을 사용합니다.
선택한 파일은 hoge입니다.jpg의 경우 hoge.txt로 출력합니다.
코드
main.pyimport os
import pyocr
import tkinter
from tkinter import filedialog
from pdf2image import convert_from_path
from PIL import Image
class UseOCR:
def __init__(self):
pyocr.tesseract.TESSERACT_CMD = '/usr/local/bin/tesseract'
self.poppler_executable_path = '/usr/local/bin/'
self.initialdir = '~/'
self.extract_lang = 'jpn+eng'
self.extension = [('pdf files', '*.pdf'),
('jpeg file', '*.jpeg'),
('jpg file', '*.jpg'),
('png file', '*.png')]
def askfilenames(self):
root = tkinter.Tk()
root.withdraw()
path = filedialog.askopenfilenames(filetypes=self.extension, initialdir=self.initialdir)
return path
@staticmethod
def get_fileinfo(path):
basename = tuple(map(os.path.basename, path))
fileinfo = dict(zip(basename, path))
return fileinfo
def pdf_to_image(self, pdf):
image = convert_from_path(pdf, poppler_path=self.poppler_executable_path)
return image
def image_to_text(self, image):
tool = pyocr.get_available_tools()[0]
txt = tool.image_to_string(
image,
lang='jpn',
builder=pyocr.builders.TextBuilder()
)
return txt
if __name__ == '__main__':
OCR = UseOCR()
path = OCR.askfilenames()
fileinfo = OCR.get_fileinfo(path)
for basename, path in fileinfo.items():
filename, extension = os.path.splitext(basename)
if extension == '.pdf':
image = OCR.pdf_to_image(path)[0]
txt = OCR.image_to_text(image)
else:
image = Image.open(path)
txt = OCR.image_to_text(image)
with open('./output/{}.txt'.format(filename), mode='w') as f:
f.write(txt)
설명
다음 글이 작성된 PDF를 사용하여 설명합니다.
이 이미지는 PDF를 jpg에 써서 트림된 것입니다.
구조기
# pyocrのTESSERACT_CMDをtesseractのパスに書き換え。場所 → which tesseract
pyocr.tesseract.TESSERACT_CMD = '/usr/local/bin/tesseract'
# convert_from_path()の引数に代入するpopplerのパス。 場所 → which pdfinfo
self.poppler_executable_path = '/usr/local/bin/'
# tkinterが起動したときのディレクトリ
self.initialdir = '~/'
# OCRする文字
self.extract_lang = 'jpn+eng'
# tkinterで選択する拡張子の指定
self.extension = [('pdf files', '*.pdf'),
('jpeg file', '*.jpeg'),
('jpg file', '*.jpg'),
('png file', '*.png')]
askfilenames
Tkinter에서 선택한 파일의 전체 경로를 반환하는 모듈>>> path = OCR.askfilenames()
>>> path
('/Users/Username/Desktop/hoge.pdf',)
get_fileinfo
전체 경로의 원조를 매개 변수로 설정하면 파일 이름과 전체 경로의 사전을 되돌려줍니다.>>> fileinfo = OCR.get_fileinfo(path)
>>> fileinfo
{'hoge.pdf': '/Users/Username/Desktop/hoge.pdf'}
pdf_to_image
PDF 파일의 경로를 매개변수에 전달한 후 PIL의 Image 객체 목록으로 돌아갑니다.
pdf2image와 PyOCR은 Pillow와 의존 관계이기 때문에 이미지 파일에 넣지 않고 Image 대상으로 돌아가는 것이 더 쉽습니다.>>> for k,v in fileinfo.items():
... image = OCR.pdf_to_image(v)
>>> image
[<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=1654x2339 at 0x10E1749E8>]
image_to_text
OCR의 중추 처리입니다.
이미지 파일 또는 Image 객체를 매개변수에 전달하는 경우 OCR을 실행하여 텍스트를 반환합니다.>>> txt = OCR.image_to_text(image[0])
>>> txt
'テストtest文字0123'
Reference
이 문제에 관하여(이미지에서 텍스트 추출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/I4MK3/items/65f087959bb8d8066916
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
import os
import pyocr
import tkinter
from tkinter import filedialog
from pdf2image import convert_from_path
from PIL import Image
class UseOCR:
def __init__(self):
pyocr.tesseract.TESSERACT_CMD = '/usr/local/bin/tesseract'
self.poppler_executable_path = '/usr/local/bin/'
self.initialdir = '~/'
self.extract_lang = 'jpn+eng'
self.extension = [('pdf files', '*.pdf'),
('jpeg file', '*.jpeg'),
('jpg file', '*.jpg'),
('png file', '*.png')]
def askfilenames(self):
root = tkinter.Tk()
root.withdraw()
path = filedialog.askopenfilenames(filetypes=self.extension, initialdir=self.initialdir)
return path
@staticmethod
def get_fileinfo(path):
basename = tuple(map(os.path.basename, path))
fileinfo = dict(zip(basename, path))
return fileinfo
def pdf_to_image(self, pdf):
image = convert_from_path(pdf, poppler_path=self.poppler_executable_path)
return image
def image_to_text(self, image):
tool = pyocr.get_available_tools()[0]
txt = tool.image_to_string(
image,
lang='jpn',
builder=pyocr.builders.TextBuilder()
)
return txt
if __name__ == '__main__':
OCR = UseOCR()
path = OCR.askfilenames()
fileinfo = OCR.get_fileinfo(path)
for basename, path in fileinfo.items():
filename, extension = os.path.splitext(basename)
if extension == '.pdf':
image = OCR.pdf_to_image(path)[0]
txt = OCR.image_to_text(image)
else:
image = Image.open(path)
txt = OCR.image_to_text(image)
with open('./output/{}.txt'.format(filename), mode='w') as f:
f.write(txt)
다음 글이 작성된 PDF를 사용하여 설명합니다.
이 이미지는 PDF를 jpg에 써서 트림된 것입니다.
구조기
# pyocrのTESSERACT_CMDをtesseractのパスに書き換え。場所 → which tesseract
pyocr.tesseract.TESSERACT_CMD = '/usr/local/bin/tesseract'
# convert_from_path()の引数に代入するpopplerのパス。 場所 → which pdfinfo
self.poppler_executable_path = '/usr/local/bin/'
# tkinterが起動したときのディレクトリ
self.initialdir = '~/'
# OCRする文字
self.extract_lang = 'jpn+eng'
# tkinterで選択する拡張子の指定
self.extension = [('pdf files', '*.pdf'),
('jpeg file', '*.jpeg'),
('jpg file', '*.jpg'),
('png file', '*.png')]
askfilenames
Tkinter에서 선택한 파일의 전체 경로를 반환하는 모듈
>>> path = OCR.askfilenames()
>>> path
('/Users/Username/Desktop/hoge.pdf',)
get_fileinfo
전체 경로의 원조를 매개 변수로 설정하면 파일 이름과 전체 경로의 사전을 되돌려줍니다.
>>> fileinfo = OCR.get_fileinfo(path)
>>> fileinfo
{'hoge.pdf': '/Users/Username/Desktop/hoge.pdf'}
pdf_to_image
PDF 파일의 경로를 매개변수에 전달한 후 PIL의 Image 객체 목록으로 돌아갑니다.
pdf2image와 PyOCR은 Pillow와 의존 관계이기 때문에 이미지 파일에 넣지 않고 Image 대상으로 돌아가는 것이 더 쉽습니다.
>>> for k,v in fileinfo.items():
... image = OCR.pdf_to_image(v)
>>> image
[<PIL.PpmImagePlugin.PpmImageFile image mode=RGB size=1654x2339 at 0x10E1749E8>]
image_to_text
OCR의 중추 처리입니다.
이미지 파일 또는 Image 객체를 매개변수에 전달하는 경우 OCR을 실행하여 텍스트를 반환합니다.
>>> txt = OCR.image_to_text(image[0])
>>> txt
'テストtest文字0123'
Reference
이 문제에 관하여(이미지에서 텍스트 추출), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/I4MK3/items/65f087959bb8d8066916텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)