CHƯƠNG 2. KHÔI PHỤC DEPTHMAP TỪ BẢN IN 2D MỘC BẢN
2.1 Quy trình chuẩn bị tập dữ liệu huấn luyện
2.1.2 Xử lý dữ liệu bán tự động
Mục tiêu của việc xây dựng công cụ này là có thể xác định một lưới cắt các vùng trên ảnh của in 2D sao cho có thể phân tách được các vùng có chữ và không có chữ (vùng nền).
Để áp dụng được phương pháp trích xuất ký tự chữ này, chúng ta cần giải thiết rằng tấm mộc bản và bản in là khớp nhau (stl và bản in khớp nhau), bỏ qua các trường hợp xấu như: tấm mộc bản bị cong, vênh; bản in bị xô lệch khi in; bản in bị mất (mờ) các đặc tính cần sử dụng như khung lề của sách; mộc bản quá xấu không theo hàng lối dẫn tới không thể khoanh được vùng để cắt chính xác.
Quy trình xử lý và đầu vào của công cụ trích xuất ký tự chữ bán tự động khác một chút so với quy trình xử lý thủ công. Thay vì cắt từng chữ từ mô hình 3D rồi lấy depthmap như trong mô tả, toàn bộ tấm mộc bản 3D sẽ được lấy depth- map. Đầu vào của công cụ trích xuất ký tự chữ là depthmap và bản in của toàn bộ mộc bản. Hai bản này sẽ được so khớp với nhau theo lề đóng khung của sách. Áp dụng thuật toán trích xuất ký tự chữ cho bản 2D, đầu ra là 1 lưới sử dụng để trích xuất ký tự. Cùng áp dụng lưới trích xuất ở trên cho cả bản in và bản depthmap để sinh ra các vùng cả có chữ và vùng nền.Hình 2.5 minh họa khung lề của sách chính là đường bao ngoài cùng của bản in, bên ngoài của lề khung sẽ không chứa chữ, bên trong của lề khung là nội dung của mộc bản.
Hình 2.5 Lề khung của sách.
Chi tiết của xử lý trích xuất ký tự chữ như sau:
Bước 1, ta thực hiện đảo chiều ảnh 2D theo chiều từ trái qua phải. Do dữ liệu từ depthmap và 2D là ngược nhau, do vậy cần đảo chiều lại để khớp cả hai dữ liệu với nhau.
Bước 2, ta xoay ảnh dựa theo khung lề của sách sao cho khung trên song song chiều ngang bức ảnh. Tức là xoay bức ảnh 1 góc α sao cho khung trên của sách và đường song song của ảnh trùng nhau. Bước xử lý này nhằm đảm bảo có thể sử dụng các ma trận ngang và dọc để cắt các vùng của ảnh. Chi tiết các bước thực hiện như sau:
Bước 2.1: Tìm đường khung của sách bằng cách tìm đường bao (contour) lớn nhất của ảnh (hàm cv2.minAreaRect)
Bước 2.2: Tìm tâm của đường bao và góc α dựa vào minAreaRect
Bước 2.3: Thực hiện xoay ảnh theo tâm và góc α ở trên theo 2 hàm cv2.getRotationMatrix2D (để lấy tâm xoay cả ảnh) và cv2.warpAffine (để xoay ảnh theo tâm và góc)
Bước 2.4: Crop ảnh sau khi xoay sử dụng các tham số lấy từ hàm cv2.boundingRect. Hình 2.6 mô tả quy trình xoay và crop ảnh, ban đầu tấm mộc bản khi xử lý sẽ có khả năng bị lệch một góc α nào đó so với chiều ngang tấm ảnh thể hiện ở bức hình đầu tiên, sau khi xoay lại góc α ta sẽ thu được một tấm mộc bản song song với chiều ngang như ô hình thứ hai, cuối cùng ta thực hiện crop phần nội dung mộc bản theo lề khung của sách.
Hình 2.6 Xoay và crop ảnh.
Bước 3, thực hiện cắt ảnh bỏ phần viền của ảnh chỉ lấy vùng trong khung lề của sách.
Bước 4, xử lý ảnh để xác định các đường dọc và ngang mức một của ảnh để có thể cắt bức ảnh thành các khối lớn. Thực hiện cắt bản in thành các khối như trên.
Bước 5, thực hiện xử lý thêm các điểm trắng trên ảnh, giảm điểm đen (làm mỏng chữ và các đường viền) bằng hàm cv2.dilate, kernel của phép tính được lấy theo chiều dọc là [w//210, h//100] và theo chiều ngang là [21, 1], trong đó w, h lần lượt là witdh và height của ảnh.
Bước 6, tìm các đường dọc, ngang sao cho tổng giá trị điểm ảnh trên đường đó không vượt quá một ngưỡng thì coi là đường đó chia được ảnh thành 2 phần khác nhau. Cụ thể theo chiều dọc và ngang giá trị ngưỡng lần lượt là w//30 và h//60.
Bước 6, sau bước trên thu được một tập các đường dọc ngang chia bức ảnh thành các hình chữ nhật, tuy nhiên các đường này có độ dày khác nhau do vậy cần thực hiện làm mỏng các đường chia (lấy đường chính giữa của các đường chia đó). Hình 2.7 minh họa cho đường mức một của một tấm mộc bản, trong hình ta thấy rằng các đường mức một chia tấm mộc bản thành các khối lớn tuy nhiên do hình thù khác nhau của những tấm mộc bản khác nhau do vậy đường mức một sẽ chỉ chia tách được các phần rõ ràng của tấm Môc bản thành các khối lớn.
Hình 2.7 Đường mức một.
Bước 7, với mỗi khối thu được ở mức một, ta tiếp tục thực hiện tìm các đường dọc và ngang (mức hai, ba, …, n) trong khối đó để cắt thành các chữ. Ở bước này ta thực hiện đệ qui để tìm kiếm các đường dọc ngang này, việc đệ qui sẽ dừng nếu không thể tìm được đường dọc hoặc ngang để cắt được các khối thành hai vùng khác nhau (tức là khối đó lúc này hoặc chứa một chữ hoặc không có chữ trong khối đó). Việc tìm các đường dọc và ngang tương tự như mô tả ở bước trên.
Bước 8, thực hiện ghép các đường dọc và ngang ở tất cả các mức và thu được một ma trận cắt theo đường dọc ngang. Hình 2.8 minh họa một ma trận cắt trong đó các đường màu đen sẽ là các đường được sử dụng để trích xuất ra khối từ cả tấm mộc bản.
Hình 2.8 Ma trận cắt, đường màu trắng thể hiện các đường cắt.
Bước 9, cắt cả bản in và bản depthmap theo ma trận cắt, kết quả thu được các vùng ở cả bản in và depthmap và được ánh xạ một-một với nhau.
Hình 2.9 Kết quả công cụ trích xuất ký tự chữ bản in 2D.
Hình 2.9 mô tả kết quả của công cụ trích xuất dữ liệu bán tự động, ta thấy công cụ đã có thể xác định được các ký tự trong trường hợp các chữ là tách biệt
và không bị chồng lấn với các ký tự khác, ngoài ra cũng có các trường hợp ký tự trích xuất bị gộp làm hai ký tự do bị chồng lấn, cũng có trường hợp trích xuất là một phần của chữ do chữ đó cấu thành từ nhiều thành phần và tách biệt nhau.
Công cụ trích xuất ký tự chữ bán tự động sử dụng Open-CV, ngôn ngữ python. Trong phiên bản này của công cụ trích xuất ký tự chữ chỉ áp dụng các phương pháp cơ bản của xử lý ảnh để tìm các vùng bao (contours). Do chỉ sử dụng đơn thuần vùng bao của ảnh nên kết quả nên công cụ sẽ có nhiều hạn chế khi thực hiện trích xuất ký tự chữ như: chữ được cắt sẽ không hoàn toàn chính xác nếu mẫu không được đẹp hoặc chữ có các khoảng không cách xa nhau; xuất hiện tình trạng trích xuất ký tự chữ thành các khoảng nhiều chữ nếu các chữ bị chồng chéo lên nhau; Không phân biệt được đâu là chữ đâu là các vùng có mực nhưng không phải là chữ.
Tuy nhiên, với công cụ trích xuất ký tự chữ này hoàn toàn có thể được sử dụng để chuẩn bị dữ liệu cho bài toán của luận văn này. Nó giải quyết được các nhược điểm mà xử lý dữ liệu thủ công gặp phải.
Để nâng cao độ chính xác đối với các đối tượng chữ, chúng ta có thể định hướng cải tiến như áp dụng thêm tập dữ liệu chữ Hán-Nôm để công cụ có thể phát hiện chữ một cách chính xác hơn. Hoặc sử dụng như một công cụ bán tự động, công cụ sẽ sinh ra lưới trích xuất dữ liệu như ở trên, sau đó cho phép người dùng chỉnh lại lưới đó một cách thủ công.