Ruby를 통해 이미지에서 텍스트 인식

10461 단어 Rubytesseract
개시하다
글이 많은 그림은 몰라도 뜻을 상상해 보세요.그때는 어떻게 하면 좋을까?번역 도구를 이용하면 생각난다.번역을 하고 싶은데 어떻게 썼는지 모르기 때문에 그때는 그림에서 텍스트를 얻는 방법이 필요하다.
그래서 오늘은 Ruby에서 그림에서 문자를 식별하는 방법을 소개하려고 합니다.
이루어지다ImageMagickTesseract를 사용하여 이미지에서 텍스트를 식별합니다.
ImageMagick: Rubi는 이미지 처리 도구입니다.
# インストール(MacOS)
brew install imagemagick
Tesseract: 옵티컬 문자 인식 텍스트 인식 도구를 사용합니다.현재 많은 언어를 지원합니다.
# インストール(MacOS)
brew install tesseract
# training dataはどこで保存しているか確認するコマンド
brew list tesseract
training 데이터 폴더에 그림에서 텍스트를 식별하는 언어를 저장해야 합니다.이번에는 영어를 사용합니다eng.traineddata.다른 언어를 사용할 때는 지원 언어를 참조하십시오.
이미지에서 텍스트를 식별하려면
다음 그림에서 텍스트를 가져오려면

1. 이미지를 흑백(회색조)으로 변환
2단계와 3단계에서 사용하기 위해서는 먼저 이미지를 흑백으로 변환해야 한다.
require 'pathname'
require 'open3'
require 'mini_magick'

INPUT = '/Users/duong.nguyen/Desktop/input'.freeze    # 元の画像を保存するフォルダ
OUTPUT = '/Users/duong.nguyen/Desktop/output'.freeze  # 処理した画像を保存するフォルダ

Pathname.new(INPUT).children.each do |f|
  src_path = f.realpath
  tmp_path = "#{OUTPUT}/#{f.basename}"

  img = MiniMagick::Image.open(src_path)
  img.colorspace('Gray')
  img.write(tmp_path)
end
위 코드를 실행하면 원래 이미지가 흑백으로 바뀝니다.
처리된 이미지:

2. 이미지 클리닝
필요 없는 것을 없애기 위해 그림을 검은색으로 바꾼다.이것은 Tesseract 텍스트를 더욱 잘 식별하는 데 도움이 된다.
# ...
Pathname.new(INPUT).children.each do |f|
  # ...
  MiniMagick::Tool::Convert.new do |magick|
    magick << tmp_path
    magick.negate
    magick.threshold('007%')
    magick.negate
    magick << tmp_path
  end
end
처리된 이미지:

3. 텍스트 인식tesseract로 텍스트를 식별하고 open3로 되돌아오는 텍스트capture를 사용합니다.
# ...
Pathname.new(INPUT).children.each do |f|
  # ...
  text, _xxx, _yyy = Open3.capture3("tesseract #{tmp_path} stdout -l eng --oem 0 --psm 3")
  puts text.strip
end
인식된 텍스트
We would all be
living there together.
모든 코드
require 'pathname'
require 'open3'
require 'mini_magick'

INPUT = '/Users/duong.nguyen/Desktop/input'.freeze
OUTPUT = '/Users/duong.nguyen/Desktop/output'.freeze
Pathname.new(INPUT).children.each do |f|
  # Step 1
  src_path = f.realpath
  tmp_path = "#{OUTPUT}/#{f.basename}"
  img = MiniMagick::Image.open(src_path)
  img.colorspace('Gray')
  img.write(tmp_path)
  # Step 2
  MiniMagick::Tool::Convert.new do |magick|
    magick << tmp_path
    magick.negate
    magick.threshold('007%')
    magick.negate
    magick << tmp_path
  end
  # Step 3
  text, _xxx, _yyy = Open3.capture3("tesseract #{tmp_path} stdout -l eng --oem 0 --psm 3")
  puts text.strip
end
끝맺다
나는 정확한 텍스트 식별은 이미지의 종류에 따른 것이냐, 아니면 이미지의 청결이 좋은 것이냐 등에 따라 이루어진다고 생각한다.따라서 어떤 경우 위의 방법으로 문자를 식별할 수 없기 때문에 텍스트의 식별 수준이 완전히 정확하지 않다.
Ruby는 기본적으로 이미지를 통해 텍스트를 식별하는 절차입니다.
이미지를 처리해야 하는 경우에 유용했으면 합니다.
참조: https://aonemd.me/posts/extracting-text-from-images-using-ruby/

좋은 웹페이지 즐겨찾기