Bạn đang tìm cách trích xuất văn bản từ hình ảnh một cách chính xác và hiệu quả? Bài viết này sẽ hướng dẫn bạn cách sử dụng **OCR (Nhận dạng ký tự quang học)** để đọc và nhóm văn bản dựa trên các đường bao quanh, ví dụ như các hình chữ nhật. Chúng tôi sẽ cung cấp các ví dụ code chi tiết và giải thích cặn kẽ từng bước, giúp bạn nắm vững quy trình này một cách dễ dàng. Bài viết này đặc biệt hữu ích nếu bạn muốn tự động hóa việc xử lý tài liệu, số hóa văn bản in, hoặc phân tích dữ liệu từ hình ảnh.
Thông thường, các công cụ **OCR** đọc văn bản theo từng dòng. Tuy nhiên, trong nhiều trường hợp, chúng ta cần nhóm các dòng này lại thành các khối văn bản có ý nghĩa, ví dụ như các đoạn văn trong một biểu mẫu hoặc các thông tin được bao quanh bởi các đường kẻ. Việc này giúp chúng ta hiểu được cấu trúc của tài liệu và trích xuất thông tin một cách chính xác hơn. Giả sử bạn có một hình ảnh chứa nhiều bảng biểu, mỗi bảng chứa thông tin riêng biệt. Nếu chỉ đọc theo dòng, bạn sẽ không biết dòng nào thuộc bảng nào. Do đó, việc nhóm văn bản là vô cùng quan trọng.
Một cách tiếp cận hiệu quả là sử dụng kết hợp thư viện OpenCV (để xử lý ảnh) và EasyOCR (một thư viện **OCR** dễ sử dụng). Quy trình bao gồm các bước sau:
Dưới đây là một ví dụ code minh họa quy trình trên:
import cv2
from easyocr import Reader
# Khởi tạo EasyOCR
reader = Reader(['en'])
# Đọc ảnh
img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Chuyển ảnh thành ảnh nhị phân (binary image)
thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# Tìm contours
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)
# Sắp xếp contours từ trái sang phải
contours = sorted(contours, key=lambda x: cv2.boundingRect(x)[0])
# Khởi tạo dictionary để lưu trữ kết quả
board_dictionary = {}
# Duyệt qua từng contour
for i, c in enumerate(contours):
x, y, w, h = cv2.boundingRect(c)
crop_img = img[y:y+h, x:x+w]
# Nhận dạng văn bản bằng EasyOCR
results = reader.readtext(crop_img)
# Tạo danh sách để lưu trữ các dòng văn bản
board_text = []
for (bbox, text, prob) in results:
board_text.append(text)
# Ghép các dòng văn bản thành một đoạn văn
board_para = ' '.join(board_text)
# Lưu trữ vào dictionary
board_dictionary[str(i)] = board_para
# In kết quả
print(board_dictionary)
**Giải thích code:**
Một phương pháp khác là sử dụng thuật toán K-means clustering để nhóm các hộp văn bản dựa trên khoảng cách giữa chúng. Tuy nhiên, phương pháp này có thể phức tạp hơn và đòi hỏi điều chỉnh tham số cẩn thận.
Bằng cách kết hợp OpenCV và EasyOCR, bạn có thể dễ dàng nhận dạng và nhóm văn bản từ hình ảnh một cách hiệu quả. Hy vọng hướng dẫn này sẽ giúp bạn giải quyết các bài toán liên quan đến **OCR** một cách thành công. Hãy thử áp dụng các kỹ thuật này vào dự án của bạn và khám phá thêm những ứng dụng tiềm năng của **OCR**!
Bài viết liên quan