Nhị phân hóa ảnh
Vì hạn chế về khả năng xử lý của thiết bị di động, cũng như tham khảo từ các tổng hợp về các phương pháp nhị phân hóa ảnh [12], chúng tôi lựa chọn sử dụng thuật toán nhị phân hóa sữ dụng ngưỡng toàn cục, với thuật toát xác định ngưỡng của Otsu.
Thuật toán xác định ngưỡng Otsu
Đầu vào: ảnh xám (grey) Đầu ra: ngưỡng nhị phân
Về cơ bản, thuật toán xác định ngưỡng Otsu duyệt qua tất cả các giá trị threshold có thể có, tính toán phương sai giữa giá trị các điểm ảnh của nội dung
(background), nền (foreground) và giá trị ngưỡng. Sau đó lựa chọn threshold có tổng phương sai giữa nền và nội dung là nhỏ nhất.
Minh họa thuật toán với một ảnh 6x6 như sau [9]:
Hình 17 Minh họa đầu vào của nhị phân hóa Otsu
Với threshold = 3, độ sai lệch của nội dung và nền so với threshold được tính như sau: Hình 18 Histogram nền Tỉ lệ : 𝑊𝑏 = 8+7+2 36 = 0.4722 Độ xám trung bình : µ𝑏 = 0 ×8 + 1 × 7 + (2 × 2) 17 = 0.6471 Phương sai:𝜎𝑏2 = 0−0.6471 2×8 + 1−0.6471 2×7 + (2−0.6471)2×2) 17 = 0.4637
Hình 19 Histogram nội dung Tỉ lệ: 𝑊𝑓 = 6+9+4 36 = 0.5278 Độ xám trung bình: µ𝑓 = 3 ×6 + 4 × 9 + (5 × 4) 19 = 3.8947 Phương sai:𝜎𝑓2 = 3 −3.8947 2× 6 + 4 −3.8947 2×9 + (5 −3.8947)2× 4) 19 = 0.5152
Phương sai trong của nội dung và nền (within class variance):
𝜎𝑊2 = 𝑊𝑏𝜎𝑏2 + 𝑊𝑓𝜎𝑓2 = 0.4772 × 0.4637 + 0.5278 × 0.5152 = 0.4909
Tương tự ta tính giá trị phương sai giữa nội dung và nền với threshold cho các threshold khác như sau:
Thresho ld T=0 T=1 T=2 T=3 T=4 T=5 Tỉ lệ (nội dung) Wb = 0 Wb = 0.222 Wb = 0.4167 Wb = 0.4722 Wb = 0.6389 Wb = 0.8889 Trung Mb = 0 Mb = 0 Mb = 0.4667 Mb = 0.6471 Mb = 1.2609 Mb = 2.0313
bình (nội dung) Phƣơng sai (nội dung) σ2 b = 0 σ2 b = 0 σ2 b = 0.2489 σ2 b = 0.4637 σ2 b = 1.4102 σ2 b = 2.5303 Tỉ lệ (nền) Wf = 1 Wf = 0.7778 Wf = 0.5833 Wf = 0.5278 Wf = 0.3611 Wf = 0.1111 Trung bình (nền) Mf = 2.3611 Mf = 3.0357 Mf = 3.7143 Mf = 3.8947 Mf = 4.3077 Mf = 5.000 Phƣơng sai (nền) σ2 f = 3.1196 σ2 f = 1.9639 σ2 f = 0.7755 σ2 f = 0.5152 σ2 f = 0.2130 σ2 f = 0 Phƣơng sai trong nội dung và nền σ2 W = 3.1196 σ2 W = 1.5268 σ2 W = 0.5561 σ2 W = 0.4909 σ2 W = 0.9779 σ2 W = 2.2491
Bảng 1 Các giá trị phương sai
Từ các kết quả trên, ta kết luận threshold = 3 là giá trị có phương sai giữa nội dung và nền bé nhất, do đó đây là giá trị được chọn. Tất cả điểm ảnh có giá trị mầu < 3 sẽ là nền, phần còn lại là nội dung.
Hình 20 Kết quả nhị phân hóa Otsu Thuật toán
1. Tính toán histogram của ảnh xám
2. Duyệt qua tất cả các giá trị threshold có thể (các mức xám của ảnh) 3. Tính toán phương sai trong nội dung và nền của giá trị threshold được
chọn
4. Threshold của ảnh sẽ là giá trị mà tại đó phương sai trong (within class variance) của nội dung và nền là lớn nhất.
Đánh giá thuật toán
Mức độ chính xác: Kết quả của bước nhị phân hóa ảnh chính xác hay không tùy thuộc vào bài toán được áp dụng. Tuy nhiên, dựa vào những đánh giá được tham khảo từ [12], thì thuật toán Otsu đã được đánh giá là một thuật toán có độ chính xác cao, thời gian xử lý nhanh và được áp dụng rộng rãi.
Độ phức tạp: O(n2
Tính dễ cài đặt: Thuật toán chỉ có 4 bước, các bước thực hiện tính toán không phức tạp. Thuật toán dễ cài đặt.
Phát hiện và xử lý nghiêng, lệch
Như đã được trình bày ở chương 3, phát hiện và xử lý nghiêng là một bước cần thiết, vì thông thường ảnh chụp từ mảy ảnh của thiết bị di động, ít nhiều sẽ không được chụp đúng góc làm ảnh chụp thường bị nghiêng, ảnh hưởng đến độ chính xác của các bước xử lý tiếp theo (phân trang, tách chữ).
Thông thường có hai trường hợp nghiêng như sau:
- Chụp nghiêng: trong trường hợp này, người chụp đặt thiết bị vuông góc (hoặc xấp xỉ vuông góc) với đường trực giao của mặt phẳng chứa chữ, tuy nhiên phương chụp không song song với phương của chữ (lệch một góc α). Dẫn đến ảnh chụp được bị nghiêng.
Hình 21 Chụp nghiêng
- Chụp lệch: trong trường hợp này, người chụp đặt thiết bị không vuông góc với đường thẳng trực giao với mặt phẳng chữ. Do đó, ảnh chụp bị lệch, méo.
Trong giới hạn của luận văn này, chúng tôi tập trung tìm hiểu đề xuất phương pháp để phát hiện và xử lý nghiêng cho trường hợp thứ nhất. Cho trường hợp thứ hai, do tính phức tạp cao hơn cũng như ít gặp hơn, trong thời gian nghiên cứu có giới hạn, chúng tôi chưa tiến hành nghiên cứu.
Để tiến hành xử lý nghiêng cho chữ Nôm, chúng tôi tiến hành tìm hiểu và tham khảo các thuật toán đã được áp dụng. Dựa trên thuật toán xử lý nghiêng cho văn bản chụp từ sách chữ latin của Wojciech Bieniechki [11], chúng tôi đề xuất phương pháp phát hiện và xử lý nghiêng cho chữ Nôm.
Phương pháp xử lý nghiêng của Wojciech Bieniechki được trình bày như sau: Ý tưởng là tìm một đường thẳng bên trái của vùng chữ. Độ dốc của đường này chính là góc xoay của vùng chữ.
Bước 1: Xác định các điểm đen trái nhất
Đầu tiên, ảnh sẻ được chuyển thành ảnh nhị phân, nhằm tăng tốc độ xử lý. Sau đó mỗi hàng ngang thứ k được quét từ trái sang phải, và điểm đen xuất hiện đầu tiên trong mỗi hàng sẽ được chứa trong mảng Tab.
Tab = ((x1, y1), (x2, y2),..., (xn, yn) (7)
Hình 23 Xác định các điểm trái
k càng nhỏ càng làm tăng độ chính xác nhưng lại làm chậm quá trình xử lý. Bước 2: Xác định điểm đen nằm trên đường biên trái
Bước tiếp theo, xác định điểm đen nào sẽ là điểm nằm trên đường biên bên trái.Ảnh có thể bị quay theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ. Trong trường hợp quay theo chiều kim đồng hồ, chúng ta nên xóa những điểm nằm ở phần dưới của vùng chữ.
Hình 24 Loại bỏ điểm dưới
Khởi tạo 2 tập các điểm thỏa mãn các điều kiện sau:
Tab1 = {xi, yi: sao cho i = 1…,n và xi-1> xi} Tab2 = Tab \ Tab1
Sau đó, chọn tập mà biểu diễn một đường “dọc hơn”, ví dụ tập lớn hơn trong 2 tập này, xem như hướng đứng nhiều hơn là nằm ngang.
TabN = Tab1 nếu |Tab1| > |Tab2| hoặc Tab2 cho các trường hợp khác.
Bước tiếp theo, loại bỏ các điểm được đánh dấu đỏ trong hình.
Hình 25 Loại bỏ điểm lùi
Tiêu chuẩn cho những điểm này là độ dời trung bình tọa độ x cho các điểm liên tục từ TabN. Đặt tên tập này là TabS.
dx = meani=1…k(xi – xi-1) với (xi, yi) ∈ TabN
TabS = {(xk, yk), (xi, yi) ∈ TabN, với i = 1…k, |xi – xi-1 – dx| < 0.1*dx
Bước 3: Xác định đường dốc và góc nghiêng tương ứng
Sau đó lấy 2 điểm từ TabS, pmin và pmax, có x tương ứng là nhỏ nhất và lớn nhất trong TabS. Ta có được đường dốc và góc quay.
Hình 26 Xác định góc nghiêng
Theo đánh giá của chúng tôi, thuật toán trên có một số hạn chế như sau:
Khi số lượng các điểm đen bên trái nằm trên đường biên ít hơn các điểm không nằm trên đường biên (hay xảy ra với chữ Nôm viết thưa) thì thuật khó đạt độ chính xác cao.
Khi khoảng cách giữa các dòng lớn thì dx sẽ có giá trị lớn, do đó việc xác định các phần tử của TabS khó chính xác.
Từ ý tưởng tìm các điểm thuộc đường biên bên trái của thuật toán trên, chúng tôi đề xuất thuật toán phát hiện và xử lý nghiêng cho chữ Nôm như sau:
Đầu vào: ảnh nhị phân (đã khử nhiễu). Đầu ra: Góc nghiêng của ảnh
Thuật toán:
1. Xác định điểm đen trái nhất I (x,y)
2. Xác định chiều nghiêng. Chiều nghiêng được định nghĩa như sau: a. Nghiêng sang trái nếu I nằm ở nữa trên.
b. Nghiêng sang phải nếu I nằm ở nữa dưới. 3. Duyệt từ trái sang phải để tìm các điểm đen bên trái
a. Từ I đi lên (nếu nghiêng sang phải) b. Từ I đi xuống (nếu nghiêng sang trái)
c. Với khoảng cách 𝛻y,ta có tập T((x1, y1), (x2, y2),…, (xn, yn)) 4. Xác định các góc hợp bởi phương thẳng đứng với đường thẳng đi qua I
và các điểm đen bên trái. a. 𝛼𝑖 = tan−1 𝑦− 𝑦𝑖
𝑥− 𝑥𝑖 (nếu nghiêng sang trái) b. 𝛼𝑖 = tan−1 𝑦𝑖− 𝑦
𝑥𝑖− 𝑥 (nếu nghiêng sang phải) 5. Góc nghiêng sẽ là góc
a. Bé nhất nếu nghiêng sang trái b. Lớn nhất nếu nghiêng sang phải
Hình 27 Minh họa thuật toán xác định góc nghiêng
Điều kiện để thuật toán chạy đúng:
Thuật toán yêu cầu một số điều kiện như sau (nếu không thõa mản, thuật toán có thể đưa ra kết quả không chính xác)
Vùng chữ trong ảnh chụp phải nằm ở trung tâm của ảnh vào.
Nếu ảnh bị nghiêng, phần lề trái của vùng chữ phải chiếm đa số vùng ảnh.
Để giúp cho những điều kiện trên được thõa mãn, ứng dụng nhận dạng phải cung cấp một vùng lựa chọn cho phép người dùng lựa chọn vùng chữ. Phương pháp lựa chọn vùng chữ này cũng được áp dụng trên các ứng dụng nhận dạng của các ngôn ngữ khác.
Đánh giá thuật toán
Mức độ chính xác: Vì dựa vào giá trị các điểm ảnh độc lập, nên thuật toán có thể không hoạt động nếu ảnh đầu vào có nhiễu.
Độ phức tạp: Với ảnh đầu vào có kích thước (n x n) thì độ phức tạp tính toán của thuật toán là: O(n2
)
Tính dễ cài đặt: Các tính toán, xử lý mà thuật toán sử dụng không phức tạp, do đó thuật toán dễ dàng để cài đặt.
Tách chữ
Phân đoạn tách chữ được xem là một trong những bước chính của tiền xử lý. Các phương pháp phân đoạn tách chữ thường áp dụng cho đặc thù ngôn ngữ, phương pháp này có thể hiệu quả với ngôn ngữ này, nhưng lại không phù hợp cho một loại ngôn ngữ khác. Nguyên nhân chủ yếu là do cấu tạo, các trình bày các ngôn ngữ khác nhau.
Chữ Nôm thường được trình bày theo hàng và cột, các chữ được viết cùng kích thước, thẳng hàng và gióng cột, do đó phương pháp tách chữ không quá phức tạp. Dựa trên histogram chiều ngang và chiều dọc, chúng tôi đã sử dụng một phương pháp đơn giản để tách chữ Nôm ra từ ảnh chụp.
Đầu vào: ảnh nhị phân (đã xử lý nghiêng) của vùng chữ Đầu ra: các chữ được tách ra
Thuật toán
1. Chiếu histogram theo chiều ngang của vùng chữ. Đường biên bao các hàng là đường ngang xuất phát từ điểm có giá trị histogram là min. 2. Chiếu histogram theo chiều dọc của vùng chữ. Đường biên bao các cột là
đường dọc xuất phát từ điểm có giá trị histogram là min. 3. Giao các cột và hàng cho ta vị trí các chữ.
Hình 28 Ảnh gốc với minh họa hàng cột
Hình 29 Chiếu histogram theo chiều ngang
Hình 30 Chiếu histogram theo chiều dọc Điều kiện để thuật toán chạy đúng:
Vì thuật toán đơn giản, nên để thuật toán chạy đúng, vùng chữ được chụp phải thỏa mãn điều kiện:
Các chữ tách nhau (không sát liền nhau)
Các chữ thẳng hàng và gióng cột
Kích thước các chữ bằng nhau
Đánh giá thuật toán
Mức độ chính xác: vì thuật toán dựa vào kết quả chiếu histogram theo các chiều, đường bao là đường tại đó histogram min, do đó khi các chữ được viết sát, kề nhau, thuật toán sẽ cho độ chính xác không cao.
Độ phức tạp:Với ảnh đầu vào có kích thước (nxn), độ phức tạp của thuật toán là O(n2
)
Tính dễ cài đặt: Thuật toán bao gồm 3 bước, phức tạp nhất là tính toán histogram, tuy nhiên đây là một tính toán đơn giản, do đó thuật toán dễ để cài đặt.
Tổng kết chƣơng 3
Trong chương 3, chúng tôi đã trình bày về các thuật toán tiền xử lý chúng tôi đã nghiên cứu, và đề xuất để áp dụng vào xây dựng hệ thống nhận dạng chữ Nôm trên thiết bị di động. Các thuật toán đã được trình bày với các nội dung: đầu vào, đầu ra, thuật toán và đánh giá thuật toán về các tiêu chí độ chính xác, độ phức tạp tính toán và tính dễ cài đặt.
Chƣơng 4. THỰC NGHIỆM, ĐÁNH GIÁ 4.1. Xây dựng mô hình nhận dạng client-server
Như được trình bày trong chương 4, chúng tôi tiến hành xây dựng hệ thống theo mô hình client-server. Quá trình tiến hành xây dựng và hoàn thiện hệ thống được tiến hành như sau:
Hình 31 Các bước tiến hành thực nghiệm
Chúng tôi tiến hành thực nghiệm với ba bước: cài đặt mô hình client-server, cài đặt các thuật toán tiền xử lý và tiến hành kiểm tra, đánh giá kết quả của các thuật toán.
Cài đặt mô hình client-server
Bước đầu tiên, chúng tôi triển khai mô hình client-server cho bài toán nhận dạng trên thiết bị di động. Ở bước này, server nhận dạng sử dụng ứng dụng nhận dạng hiện có [1] trên PC, để xây dựng thành Web-service nhằm mục đích dễ dàng truy cập và sử dụng từ client là thiết bị di động. Ở phía client (thiết bị Android), chúng tôi xây
Cài đặt mô hình client-server
• Chuyển ứng dụng nhận dạng thành Web-service
• Cài đặt ứng dụng client trên điện thoại Android kết nối đến server
Cài đặt các thuật toán
• Cài đặt các thuật toán tiền xử lý trên điện thoại Android
Kiểm tra, đánh giá
• Kiểm tra các kết quả
dựng ứng dụng có chức năng kết nối đến server để yêu cầu nhận dạng và nhận kết quả trả về.
Thông tin về server như sau:
URL: http://112.137.130.44:8080/Service1.asmx Namespace: NomRecognition
Hình 32 Thông tin dịch vụ (service) nhận dạng của server
Cài đặt thuật toán nhận dạng trên Android
Hình 33 Thiết kế kiến trúc của chương trình client
Ứng dụng được thiết kế theo mô hình MVC nhằm giúp cho các các module trở nên độc lập, nhằm dễ dàng cho việc nâng cấp sau này. Module Views thực hiện cài đặt các màn hình chính của chương trình. Module Controller cài đặt các thuật toán tiền xử lý đã được trình bày trong chương 4, được sử dụng cho bước tiền xử lý của bài toán nhận dạng. Module Models cài đặt các mô hình dữ liệu sử dụng trong bài toán nhận dạng.
Người dùng thao tác với các Views để thực hiện việc nhận dạng, các thuật toán tiền xử lý, giao tiếp với server nhận dạng sẽ được thực hiện ở module Controller, và kết quả trả về sẽ được trả về dưới dạng dữ liệu được định nghĩa ở Models.
Module Views
Chương trình gồm 3 màn hình: màn hình chụp ảnh (CaptureActivity), màn hình nhận dạng một từ (WordRecognitionActivity), và màn hình thực hiện tách chữ và nhận dạng nhiều từ (SegmentationActivity).
Màn hình chụp ảnh cung cấp cho người dùng màn hình để thực hiện việc lựa chọn vùng chữ và chụp ảnh của chữ. Controller CharacterRecognition OtsuBinarization SkewDetectAndCorrect Segmentation Models NomMeanMap SegmentationResult Views CaptureActivity WordRecognitionActivity SegmentationActivity
Hình 34 Ảnh minh họa chụp và chọn chữ
Sau khi người dùng thực hiện xong chụp ảnh, màn hình nhận dạng một từ được hiển thị với ảnh chụp đã được thực hiện nhị phân hóa.
Nếu ở màn hình chụp ảnh, chỉ một từ được lựa chọn, người dùng có thể lựa chọn nhận dạng luôn. Nếu là một vùng chữ được chọn, người dùng lựa chọn thưc hiện tách chữ, màn hình tách chữ và nhận dạng được hiển thị để bắt đầu tiến hành xử lý nghiêng và tách chữ.
Sau khi quá trình xử lý nghiêng và tách chữ thự hiện xong, nút nhận dạng sẽ được hiển thị để người dùng lựa chọn.
Hình 36 Hiển thị nút nhận dạng
Hình 37 Hiển thị kết quả nhận dạng
Module Controller
Các thuật toán được cài đặt trong module Controller, mỗi thuật toán sẽ được cài đặt trong một lớp độc lập. Do đó, việc cải tiến thuật toán, hay cài đặt thêm các thuật toán là dễ dàng và không làm ảnh hưởng đến các thuật toán khác.
Lớp CharacterRecognition thực hiện kết nối với server, gửi ảnh bitmap (được mã hóa dưới dạng chuỗi) của ảnh lên sau đó nhận kết quả nhận dạng và chuyển đổi mã