Skip to content

OCR กับภาษา Python

สวัสดีผู้อ่านทุกท่านครับ บทความนี้ผมจะพาผู้อ่านไปใช้ OCR กับภาษา Python กันครับ

OCR คืออะไร ?
OCR ย่อมาจาก Optical character recognition คือ การแปลงข้อความจากไฟล์ภาพเอกสาร ให้เป็นข้อความโดยอัตโนมัติ มีประโยชน์ช่วยให้ลดเวลาการพิมพ์เอกสารซับซ้อนลงได้

เนื่องจากการใช้เทคโนโลยี Optical character recognition กับภาษา Python ไม่ค่อยจะเหมาะสมเท่าไร เพราะเทคโนโลยี Optical character recognition มีความซับซ้อนของระบบค่อนข้างสูงมาก การลงทุนพัฒนาไม่ใช่เรื่องง่าย ภาษา Python เป็นภาษาแบบอินเตอร์เฟส จึงควรต้องใช้ภาษาแบบคอมไพเลอร์ เพื่อความรวดเร็วในการทำงาน

การลงแรงพัฒนาเทคโนโลยี Optical character recognition เป็นเรื่องที่ผมหรือไม่ว่าใครก็ตามจะทำคนเดียวได้ ผมจึงใช้ tesseract ซึ่งเป็น OCR engine แบบ open source ใช้ Apache License 2.0 ที่ตอนนี้ Google เป็นเจ้าของครับ โดย tesseract รองรับภาษาไทยด้วยนะครับ

สามารถเข้าไปโหลด tesseract มาติดตั้งได้จาก https://github.com/tesseract-ocr
สำหรับผู้ใช้งาน windows สามารถโหลดไฟล์ติดตั้งได้จาก https://github.com/UB-Mannheim/tesseract/wiki

ทำการติดตั้งและเลือกภาษาไทยด้วยนะครับ (ขออภัยที่ผมไม่มีรูปภาพตอนติดตั้งครับ เพราะผมไม่ได้บันทึกไว้ครับ)

กำหนดค่า path กับโฟลเลอร์ที่ติดตั้ง tesseract ให้เรียบร้อยแล้ว ต่อไปเราจะลงมือเขียนโค้ดภาษา Python เพื่อใช้ tesseract ครับ

tesseract สามารถใช้งานได้ผ่านคอมมาไลน์ โดยรองรับไฟล์ภาพ png , jpg อ่านรายละอียดได้ที่ https://code.google.com/p/tesseract-ocr/wiki/ReadMe

เนื่องจากภาษา Python ไม่ได้มีโมดูลสำหรับเรียกใช้งาน tesseract ผมจึงเขียนโค้ดขึ้นมาเอง

โค้ดในบทความนี้เข้ากันได้กับ Python 3 เท่านั้น ไม่รองรับ Python 2.6 และ Python 2.7

โค้ดไฟล์ ocr.py

import tempfile
import subprocess

def text_from_image_file(image_name,lang):
    output_name = tempfile.mktemp()
    return_code = subprocess.call(['tesseract',image_name,output_name,'-l',lang],stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    d = open(output_name+'.txt','r',encoding='utf-8')
    return d.read()

ต่อไปเรามาลองทดสอบการใช้งาน tesseract กับภาษา Python กันครับ
ไฟล์รูปภาพที่ทดสอบ โหลดได้ที่ https://www.dropbox.com/sh/qzo2m76fd5gj6yl/AADztG3QYOa3rRG_IYliqQ5qa?dl=0
โค้ดทดสอบ test.py

import ocr as ocr
print(ocr.text_from_image_file('test-eng.PNG','eng')) # ดึงไฟล์ test-eng.PNG เข้ามา โดยกำหนดเป็นภาษาอังกฤษ
print(ocr.text_from_image_file('test-thai.PNG','tha')) # ดึงไฟล์ test-thai.PNG เข้ามา โดยกำหนดเป็นภาษาไทย
print(ocr.text_from_image_file('4.PNG','eng')) # กำหนดเป็นภาษาอังกฤษ
print(ocr.text_from_image_file('5.PNG','eng')) # กำหนดเป็นภาษาอังกฤษ
print(ocr.text_from_image_file('6.PNG','eng')) # กำหนดเป็นภาษาอังกฤษ
print(ocr.text_from_image_file('7.PNG','eng')) # กำหนดเป็นภาษาอังกฤษ

ไฟล์ test.py กับไฟล์ ocr.py ต้องอยู่ในโฟลเลอร์เดียวกันครับ
ผลลัพธ์

จะเห็นได้ว่า มีความแม่นยำพอใช้ได้ แต่ภาษาไทย จะอ่านได้เฉพาะ Font ที่เป็นที่นิยมกันครับ เช่น Angsana New เป็นต้น
ผมขอทิ้งท้ายประโยคหนึ่งว่า

ภาษาคอม ฯ เป็นแค่เครื่องมือสำหรับใช้พัฒนาโปรแกรมเท่านั้น ไม่ใช่ของคุณ ภาษาคอม ฯ อาจมีเกิดและดับไปตามเทคโนโลยีตามที่โลกหมุนไปไม่เคยอยู่นิ่ง แต่องค์ความรู้และมันสมองของคุณเป็นของคุณจริง ๆ และเป็นสิ่งเดียวที่ใช้ได้ไปตลอดชีวิตของคุณ

หน้าเว็บโครงการ https://github.com/tesseract-ocr
ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

ปรับปรุงครั้งที่ 1 วันที่ 11/10/2015 แก้ไขโค้ด test.py หาย

Published on Categories ไม่มีหมวดหมู่

About wannaphong

วรรณพงษ์ ภัททิยไพบูลย์ ผู้ดูแลเว็บ wannaphong.com และผู้เขียนบทความบล็อกนี้ นักศึกษาชั้นปีที่ 1 สาขาวิทยาการคอมพิวเตอร์และสารสนเทศ คณะวิทยาศาสตร์ประยุกต์และวิศวกรรมศาสตร์ มหาวิทยาลัยขอนแก่น วิทยาเขตหนองคาย

4 thoughts on “OCR กับภาษา Python

  1. ณภัทร

    FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Mike\\AppData\\Local\\Temp\\tmp6c7zdcg2.txt'

    ขึ้นอย่างงี้ครับ

    Reply
  2. ณภัทร

    Traceback (most recent call last):
    File "C:/Users/Mike/PycharmProjects/OCR/capture.py", line 4, in
    print(ocr.text_from_image_file('test-thai.PNG','tha'))
    File "C:\Users\Mike\PycharmProjects\OCR\ocr.py", line 7, in text_from_image_file
    d = open(output_name+'.txt','r',encoding='utf-8')
    FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Mike\\AppData\\Local\\Temp\\tmpgwgxoon0.txt'

    มันอ่านภาษาไทยไม่ได้หนะ

    Reply

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องที่ต้องการถูกทำเครื่องหมาย *