HomeArtTechHackBlockchain

มาทดลองทำ OCR Scan ดึง Text ออกมาจากรูปภาพง่ายๆกันดีกว่า

By Khomkrid Lerdprasert
Published in Technology
August 03, 2021
1 min read
มาทดลองทำ OCR Scan ดึง Text ออกมาจากรูปภาพง่ายๆกันดีกว่า

วันนี้จะมาลองเล่น OCR เพื่อ ดึง Text ออกมาจากรูปภาพง่ายๆกันดูครับ โดยพระเอกของงานนี้ คือ 1 ใน 6 อัญมณี ผีฟ้า infinity stone ก็คือ Tesseract นั่นเอง

หลังจากที่ จบสงคราม End Game ไปเรียบร้อยแล้ว infinity stone ทั้งหมดกลับสู่ timeline ของตัวเอง โลกก็กลับสู่ความ สงบสุขอีกครั้ง และไอ้เจ้า Tesseract หลังจากสิ้น Tony Stark ก็ได้ตกไปอยู่ในมือของเจ้าพ่อ เทคโนโลยีอย่าง Google https://opensource.google/projects/tesseract

มาเรามาลองกันแบบ ง่ายๆ แรกเริ่มประเดิมงานกันก่อนฮะ

ด้วยการสั่ง install ผ่าน home brew บน osx ส่วน os อื่นไปหาเอง

brew install tesseract

หลังจาก install แล้ว ลอง run คำสั่ง

tesseract --list-langs

ระบบจะทำการลิสภาษาที่ support ออกมาให้เรา แม่งไม่มีภาษาไทย ฮาๆๆๆๆ

brew install tesseract-lang

ทำการเพิ่ม package ภาษาลงไปให้หมด แล้ว list-langs มาดูใหม่ จะเห็นว่ามีภาษาไทยแล้วจ้า

หลังากนั้นเราจะมาทดลอง ด้วยการลองโอนเงินไปให้ Grab Taxi สัก 200 ดู แล้วเอา Slip มาใช้งาน

ใบเสร็จรับเงิน

ลอง run command ดู

tesseract IMG_7979.JPG textfile -l tha --dpi 380
Tesseract Open Source OCR Engine v4.1.1 with Leptonica
Detected 25 diacritics

เราจะได้ textfile.txt ขึ้นมา 1 file

cat textfile.txt  ✔  116610:27:42
เติมเงินสําเร็จ
10 ก.ุค. 64 15:20 น. |<+
นาย คมกฤษณ์
ธ.กสิกรไทย
2<-%-%8982-%
ง/
(6เลเง?7ลบ ฟิลแนล! 9อเพลเลสู่ แห |<3ลท
0925905444 เมกน
202107100047879
เลขที่รายการ:
ว วร รรล
จํานวน:
:0
ค่าธรรมเนียม: :
0.00 บาท ลทพ์กิลส อบ 1<+

เป็นอันเรียบร้อย แต่ดูเหมือนว่ามันจะมีปัญหากับภาษาไทยอยู่

งั้นเรามาลองทดสอบใหม่กับภาษา อังกฤษดูกันก่อน

tesseract 04.png textfile -l eng --dpi 380
Tesseract Open Source OCR Engine v4.1.1 with Leptonica

go fiber
go fiber

cat textfile.txt  ✔  116810:31:47
&Y Welcome
An online API documentation with examples so you can start building web apps with Fiber right away!
Fiber is an Express inspired web framework built on top of Fasthttp, the fastest HTTP engine for Go.
Designed to ease things up for fast development with zero memory allocation and performance in
mind.

เรียบร้อย ทำงานได้ถูกต้อง แต่พอเป็น Slip ภาษาไทย มันจะเพี้ยน งั้นเราจะมาลองเขียน เป็น python เพื่อจัดการไฟล์ต้นฉบับกันสักนิดนึงก่อนทำการแปลง เป็น text กันครับ

import cv2
import pytesseract
img = cv2.imread('IMG_7979.JPG')
custom_config = r'-l tha --oem 3 --psm 6 -c language_model_ngram_space_delimited_language=1'
print(pytesseract.image_to_string(img, config=custom_config))

output

เตมเงนสาแรจ
| 10 ก.ค. 64 15:20 1 |<+
นาย คมกฤษณ์
6 ธ.กสิกรไทย
2๐๐-%-%8982-%
ง/
(6หลเว7ลบ ทปลและ ๐พลหลคด อบ (8ลท
๐๑ 0925905444 |
202107100047879 0('
เลขที่รายการ: เน
011191152049629525 [@ไวย์%[]
จํานวน: 5 รันร
200.00 บาท ซาร เลร
คํารรรมณียบ: : 5 [] ซี ท ว
ดูดผูวิท . ง๑หกอส่อบ«๓

จากนั้นเราจะทำการแก้ไข code เล่นนิดหน่อย ให้ opencv ทำการวาด box ให้กับ words ที่เราค้นหาเจอในภาพ

import cv2
import pytesseract
from pytesseract import Output
img = cv2.imread('IMG_7719.JPG')
custom_config = r'-l tha --oem 1 --psm 6 -c language_model_ngram_space_delimited_language=1'
data = pytesseract.image_to_data(img,config=custom_config, output_type=Output.DICT)
keys = list(data.keys())
totalBox = len(data['text'])
for i in range(totalBox):
(x, y, w, h) = (data['left'][i], data['top'][i], data['width'][i], data['height'][i])
img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('img', img)
cv2.waitKey(0)
print(''.join(data['text']))

เมื่อทดลอง run จะได้ผลลัพท์ดังนี้

|โอนเงินสําเร็จ1<+28มิย.6407:04น.นายคมกฤษณ์!เ6ธ.กสิกรไทย2๐๐-%-%8982-%ง/น.ส.กนกรัตน์หงษ์ขาว69ธ.กสิกรไทย2๐๐-%-%7776-%เลขที่รายการ:011179070444500539[][]จํานวน:แห18,000.00บาทพค่าธรรมเนียม:[]อ0.00บาทง๑ทพกิลดเวบ|<+

rectangle box
rectangle box

ต่อไปเราจะมาลองใช้รูปบัตรประชาชนดูบ้าง

id card
id card
โดยผมจะโหลดมาจาก google ละกันครับ

https://www.rd-comp.com/product/tra301bt/

โดยผลลัพท์จาการดึงจะได้เป็น

ข้อมูลประจําตัวประชาชนโล!1ง๑น่อกล110ละสDataสรมซ้ตั05น,1234567890123jต|a==รื่อตัวและชื่อสกุลใยติวอย่างนามรองสาธตสกุล=NameMr,Sample=LastnameMiddleNameSatitsakul=เลิดวัจเซี่a=เกิดวันที30มี.ค.2508พง.180=DateofBirth30Mar.1965=กกSSfog1/11val11ตรอกปฐมซ.สุขุมวิท1ถ.สุขุมวิทaฒิ=แขวงคลองเตยเหนือเขตพระโขนงกรุงเทพมหานคร=315.0.25504เม.ย.256329มี.ค.2556150.150๒๒๒วันออกบัตร11:46:02น.วันบัตรหมดอายุoeอ--==31Dec.2007วันเวลาที่อ่านบัตร29Mar.2013งว=dateofIssuewwwad-comp.comDateofExpiry1284-56-78901234q\laiienkesiiauseanmsthemmiioslaeaha1.2.000:

ซึ่งมันอ่านไม่ค่อยออก ผมเลยจะทำการเปลี่ยนรูปเป็น gray scale ก่อน ด้วยการเพิ่ม func ลงไป

def get_grayscale(image):
return cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray = get_grayscale(img)
img = gray

rectangle box
rectangle box

ข้อมูลประจําตัวประชาชนโล]งลนอกล110ละ๕ปล18สะตระบน,1234567890123กvo2==รื่อตัวและชื่อสกุลใยติวอย่างนามรองสาธตสกุล=NameMr,Sample=LastnameMiddleNameSatitsakul=เดิดวงเซี่a=เกิดวันที30มี.ค.250814180=>DateofBirth30Mar.1965=กกSSท่อยู่บ11หมู่ที่1ตรอกปฐมซ.สุขุมวิท1ถ.สุขุมวิทaฒิ=แขวงคลองเตยเหนือเขตพระโขนงกรุงเทพมหานคร”=315.0,25504ie,256329dia.2556150.L1505วันออกบัตร114602นวันบัตรหมดอยุ77>==31Dec.2007วันเวลาที่อ่านบัตร29Mar.2013«=dateofIssuewww.rd-comp.comDateofExpiry1234-56-78901234ไม่ใช่บัตรประจําตัวประชาชนสร้างภาพบัตรโดยภเริฒล01.2.000

ต่อไปจะลองปรับ thresholding มันคืออะไร ตามไปอ่านที่นี่ http://56cjgj.blogspot.com/2017/02/thresholding.html

ด้วยการเพิ่ม func อีกตัว

def thresholding(image):
return cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)[1]
gray = get_grayscale(img)
thresh = thresholding(gray)
img = thresh

rectangle box
rectangle box

เฉพตตน,1234567890123jน.voa==รื่อตัวและชื่อสอุลนยติวอย่างนามรองสาธตสกุล=NameMr,Sample=LastnameMiddleNameSatitsakul—_aea=เกิดวันที3031.A,2508180.19=>DateofBirth30Mar.1985=am05ห่อยู่บ11หมู่ที่1ตรลกปฐมซ.สุขุมวิท1ถ.สุขุมวิทa‘a=แขวงคลองเตยเหนือเขตพรืะโขนงกรุงเทพมหานครต5ว15.ค25504BLY.256329มี.ค.2556150.[1505วันจะกบัตร114602นวันบัตรหมดยยุ7-เอมSS31Dec.2007วันเวลาที่อ่านบัตร29Mar.2013;FSdateoftesuswwrw.rd-compcomDateofExpiry1234-56-78901234ไม่ใช่มัตรประจําตัวประชาชนสร้างภาพบัตรโดย47ข๓เฮ01.2.000

เท่าที่ลองดึงดู ภาษาอังกฤษ จะได้ words มาค่อนค่างแม่นยำ แต่พอเป็น non english อย่างเช่นภาษาไทย จะแยกคำออกมาเป็น ตัวอักษรละ คำเลย

['', '', '', '', 'เฉ', '', 'พ', 'ต', 'ต', 'น,', '1', '2345', '67890', '12', '3', '', 'j', 'น.', 'vo', 'a', '', '==', 'ร', 'ื', '่', 'อ', 'ต', 'ั', 'ว', 'แล', 'ะ', 'ชื', '่', 'อ', 'ส', 'อุ', 'ล', 'น', 'ย', 'ต', 'ิ', 'ว', 'อ', 'ย', '่', 'า', 'ง', 'น', 'า', 'ม', 'ร', 'อ', 'ง', 'ส', 'า', 'ธ', 'ต', 'ส', 'ก', 'ุ', 'ล', '', '=', 'Name', 'Mr,', 'Sample', '', '=', 'Last', 'name', 'MiddleName', 'Satitsakul', '', '—_', 'ae', 'a', '', '=', 'เก', 'ิ', 'ด', 'ว', 'ั', 'น', 'ท', 'ี', '30', '31.A,', '2508', '180.', '19', '', '=>', 'Date', 'of', 'Birth', '30', 'Mar.', '1985', '', '=', 'a', 'm0', '', '5', 'ห่', 'อ', 'ย', 'ู', '่', 'บ', '11', 'ห', 'ม', 'ู', '่', 'ท', 'ี', '่', '1', 'ต', 'ร', 'ล', 'ก', 'ป', 'ฐ', 'ม', 'ซ', '.', 'ส', 'ุ', 'ขุ', 'ม', 'ว', 'ิ', 'ท', '1', 'ถ', '.', 'ส', 'ุ', 'ขุ', 'ม', 'ว', 'ิ', 'ท', 'a', '‘a', '', '=', 'แข', 'ว', 'ง', 'ค', 'ล', 'อ', 'ง', 'เต', 'ย', 'เห', 'น', 'ื', 'อ', 'เข', 'ต', 'พ', 'ร', 'ื', 'ะ', 'โข', 'น', 'ง', 'ก', 'ร', 'ุ', 'ง', 'เท', 'พ', 'ม', 'ห', 'า', 'น', 'ค', 'ร', 'ต', '', '5', 'ว', '15.', 'ค', '2550', '4', 'BLY.', '2563', '29', 'ม', 'ี', '.', 'ค', '.', '2556', '150.', '[', '150', '', '5', 'ว', 'ั', 'น', 'จ', 'ะ', 'ก', 'บ', 'ั', 'ต', 'ร', '114602', 'น', 'ว', 'ั', 'น', 'บ', 'ั', 'ต', 'ร', 'ห', 'ม', 'ด', 'ย', 'ย', 'ุ', '7', '-', 'เอ', 'ม', '', 'SS', '31', 'Dec.', '2007', 'ว', 'ั', 'น', 'เว', 'ล', 'า', 'ท', 'ี', '่', 'อ', '่', 'า', 'น', 'บ', 'ั', 'ต', 'ร', '29', 'Mar.', '2013', ';', '', 'FS', 'date', 'of', 'tesus', 'wwrw.rd-compcom', 'Date', 'of', 'Expiry', '1234-56-78901234', '', 'ไม', '่', 'ใช', '่', 'มั', 'ต', 'ร', 'ป', 'ร', 'ะ', 'จ', 'ํ', 'า', 'ต', 'ั', 'ว', 'ป', 'ร', 'ะ', 'ชา', 'ชน', 'ส', 'ร', '้', 'า', 'ง', 'ภา', 'พ', 'บ', 'ั', 'ต', 'ร', 'โด', 'ย', '4', '7', 'ข', '๓', 'เฮ', '0', '1.2.000']

ถ้าจะทำมาใช้งานจริงจัง คงต้องค้นคว้าอีกเยอะ


Tags

#python#ocr#tesseract

Share

Previous Article
มาเปลี่ยน Website ที่เปิดใน Chrome เป็น Darkmode กันเถอะ
Khomkrid Lerdprasert

Khomkrid Lerdprasert

Full Stack Life

Related Posts

สร้าง Key pair เพื่อทำการ signing document signature ด้วย Go lang
March 13, 2024
1 min
© 2024, All Rights Reserved.
Powered By

Quick Links

Author

Social Media