Các phƣơng pháp tiền xử lý áp dụng, đề xuất

Một phần của tài liệu Các phương pháp tiền xử lý trong nhận dạng chữ Nôm trên thiết bị di động (Trang 32)

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ềnnộ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 dungnền so với threshold được tính như sau:

Hình 18 Histogram nền Tỉ lệ :

Độ xám trung bình : Phương sai:

Hình 19 Histogram nội dung Tỉ lệ:

Độ xám trung bình: Phương sai:

Phương sai trong của nội dungnền (within class variance):

Tương tự ta tính giá trị phương sai giữa nội dungnền với threshold cho các threshold khác như sau:

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 σ 2W = 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 dungnề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 dungnề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 dungnề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.

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. (adsbygoogle = window.adsbygoogle || []).push({});

Để 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)) (adsbygoogle = window.adsbygoogle || []).push({});

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. (nếu nghiêng sang trái)

b. (nếu nghiêng sang phải)

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ữ

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 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. (adsbygoogle = window.adsbygoogle || []).push({});

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 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

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ả

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

Chúng tôi thiết kế chương trình như sau:

Views CaptureActivity WordRecognitionActivity SegmentationActivity Controller CharacterRecognition OtsuBinarization SkewDetectAndCorrect Segmentation Models NomMeanMap SegmentationResult

Ứ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ữ.

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.

Hình 35 Kết quả 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

Sau khi chữ được nhận dạng, nghĩa của từng chữ được hiển thị ở dưới mỗi chữ.

Module Controller (adsbygoogle = window.adsbygoogle || []).push({});

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ã kết quả thành nghĩa Tiếng Việt.

Lớp OtsuBinarization cài đặt thuật toán nhị phân hóa ảnh, thực hiện việc xác định ngưỡng của ảnh xám sau đó nhị phân hóa ảnh xám thành ảnh nhị phân.

Sau khi ảnh được nhị phân hóa, lớp SkewDetectAndCorrect cài đặt thuật toán phát hiện và xử lý nghiêng sẽ thực hiện xử lý nghiêng cho ảnh. Đầu ra sẽ là ảnh đã được xử lý nghiêng.

Lớp Segmentation lấy đầu vào là ảnh đã được xử lý nghiêng, cài đặt thuật toán tách chữ để tiến hành tách chữ. Đầu ra sẽ là một mảng các đối tượng SegmentationResult. Sử dụng mảng đối tượng này, khi người dùng lựa chọn nhận dạng, mỗi chữ sẻ được thực hiện nhận dạng bởi lớp CharacterRecognition.

Một phần của tài liệu Các phương pháp tiền xử lý trong nhận dạng chữ Nôm trên thiết bị di động (Trang 32)