12/08/2018, 13:39

Tìm hiểu về OCR, xây dựng chức năng Extract text từ hình ảnh sử dụng PHP

How to extract text from images ? Chào mọi người, hôm nay mình sẽ giới thiệu cách làm thế nào để có thể đọc được text từ hình ảnh có sẵn. Trước tiên đi vào thực hiện (code) mình sẽ trình bày sơ qua về cái mà mình sẽ sử dụng đó là công nghệ nhận dạng ký tự quang học OCR. Vậy thì OCR là gì ??? ...

OCR.jpg

How to extract text from images ?

Chào mọi người, hôm nay mình sẽ giới thiệu cách làm thế nào để có thể đọc được text từ hình ảnh có sẵn. Trước tiên đi vào thực hiện (code) mình sẽ trình bày sơ qua về cái mà mình sẽ sử dụng đó là công nghệ nhận dạng ký tự quang học OCR. Vậy thì OCR là gì ???

1. Khái niệm

OCR là một thuật ngữ viết tắt từ cụm từ Optical Character Recognition có thể dịch nôm na nó là Nhận dạng ký tự bằng quang học. Đây là công nghệ được áp dụng để đọc text trên một file ảnh thành định dạng text.

2. Ứng dụng

Chắc hẳn các bạn đã một lần sử dụng đến công nghệ nhưng không để ý, vì chúng ta chỉ sử dụng nó một cách gián tiếp đó là máy Scanner. OCR được ứng dụng như một phần mềm được tích hợp trên máy tính hoặc trực tiếp vào một phần cứng nào đó. Một số phần mềm khá nổi tiếng như:

  • ABBYY FineReader
  • PDF OCR
  • http://www.onlineocr.net
  • ...

Trong số những phần mềm đó thì mình nghĩ ABBYY FineReader là phần mềm tốt nhất, đơn giản vì thời sinh viên mình rất hay dùng phần mềm này để convert những file PDF sang word để copy cho nhanh đỡ phải gõ lại (haha)

3. Hạn chế của OCR

Bên cạnh đó thì OCR cũng còn khá nhiều những hạn chế như:

  • Hầu hết các phần mềm sử dụng OCR chỉ nhận dạng được khoảng 80 - 90% trên hình ảnh rõ nét.
  • Đối với những hình ảnh có màu nền mà màu chữ không có nhiều chênh lệch, hay các hình chụp chữ viết tay thì kết quả nhận dạng không khả quan cho lắm
  • Đến thời điểm hiện tại thì OCR chưa support tất cả các ngôn ngữ.

4. Xây dựng demo chức năng Extract text from Image sử dụng OCR

Mình sẽ code demo chắc năng này với CakePHP và sử dụng IDOL OCR API (A.hihi)

IDOL OCR API là gì thì mình xin giới thiệu nhanh, nó là một web-service và bạn có thể dử dụng service này ở nhiều ngôn ngữ như PHP , Java , .NET , Python,…etc. Còn trong khuôn khổ bài viết này thì mình sẽ sử dụng ngôn ngữ PHP =)) IDOL OCR API support những format sau:

- Image Formats
  • TIFF
  • JPEG
  • PNG
  • GIF
  • BMP and ICO
  • PBM, PGM, and PPM
- Document Formats
  • Adobe PDF (PDF)
  • Microsoft Word Documnent (DOC and DOCX)
  • Microsoft Excel Sheet (XLS and XLSX)
  • Microsoft Powerpoint Presentation (PPT and PPTX)
  • OpenDocument Text (ODT)
  • Rich Text (RTF)

Để sử dụng service này thì việc cần làm những bước sau

Bước 1

Đăng ký một tài khoản tại đây

Bước 2

Đăng nhập và copy API Key tại đây Selection_026.png

Xong 2 bước trên bạn đã có thể sử dụng service này rồi, bạn có thể sử dụng web service này với cả phương thức POST và GET, còn trong demo này mình sẽ sử dụng phương thức POST thôi nhóe!

Lý thuyết nhiều rồi, nào! bây giờ là lúc các bạn bắt tay vào thực hiện một chức năng để hiểu được những gì mình đã giới thiệu bên trên. Tất cả những thứ bạn cần làm là 1 action và một view thể hiện giao diện của action đó.

View: TopPages/extract_text_from_images.ctp

<div class="row">
    <div class="container">
        <form class="form-group" action="" method="post" enctype="multipart/form-data">
            <div class="col-md-4">
                <?php if ($image) { ?>
                <div class="row">
                <label>Extracted text from Image</label>
                    <div class="col-md-12">
                        <img src="<?php echo $image ;?>" class="img-rounded img-responsive"/>
                    </div>
                </div>
                <?php } ?>
                <div class="row">
                    <label>Select file:</label>
                    <input type="file" name="file" class="form-control" />
                </div>
                <div class="row">
                    <label>Select mode</label>
                    <select class="form-control" name="mode">
                        <option value="subtitle">Subtitle</option>
                        <option value="scene_photo">Scene_photo</option>
                        <option value="document_scan">Document_scan</option>
                        <option value="document_photo">Document_photo</option>
                    </select>
                </div>
                <div class="row">
                    <br/>
                    <input type="submit" value="Extract" class="btn btn-primary form-control"/>
                </div>
            </div>
            <div class="col-md-4">
                <label> 科目</label>
                <input type="text" name="subject" value="<?php echo $subject; ?>" class="form-control" />
                <label> 技能士番号</label>
                <input type="text" name="skills" class="form-control" value="<?php echo $skillNumber; ?>" />
                <br/>
                <textarea class="form-control" rows="15" placeholder="Result"><?php echo $scanOCR; ?></textarea>
            </div>
        </form>
    </div>
</div>

Để thực hiện extract text from image, mình cần 1 input để chọn ảnh, 1 box để hiển thị ảnh, một select box để hiển thị các chế độ (mode) ứng với từng hình ảnh và một nút submit. Ý nghĩa của các mode như sau, mình xin copy nguyên tài liệu để tránh dịch sai ý nghĩ gốc của nó

  • document_photo: (default) Use to recognize text in a document that has been digitized with variable light, such as through a mobile phone camera.

  • document_scan: Use to recognize text in a document that has been digitized with constant lighting, such as through a flatbed scanner.

  • scene_photo: Use to recognize text in a scene, for example signs and billboards in a landscape.

  • subtitle: Use to recognize text superimposed on an image, such as TV subtitles.

Ứng với từng mode thì text được extract ra hình ảnh là khác nhau, ở đây mình chọn mode là subtitle bời vì hầu hết các hình ảnh mình thực hiện đề có dạng văn bản chồng lên hình ảnh             </div>
            
            <div class=

0