Mỗi đoạn phân ra phải gán nhãn cho chúng bằng tập nhãn { L, M, S, U}. Qua thực nghiệm nhóm nghiên cứu Ming-Gang Wen, Kuo-Chin Fan và Chin-Chuan Han [16] đã đưa ra giá trị ngưỡng cho từng loại phân đoạn như sau:
Phân đoạn S có ngưỡng là Phân đoạn M có ngưỡng là Phân đoạn L có ngưỡng là
Phân đoạn U có ngưỡng nhỏ hơn
) 8 / ( * * 3 , 0 H Sin ) 8 / ( * * 5 , 0 H Sin ) 8 / ( * * 85 , 0 H Sin ) 8 / ( * * 3 , 0 H Sin (4.7) (4.8) (4.9) (4.10)
(H là tổng số bin có trong Hitogram)
Quá trình phân đoạn là quá trình tính tổng số pixel trên các bin lớn nhất, liền kề và chưa được xét để so sánh với giá trị ngưỡng trong các phân đoạn. Ưu tiên so sánh đoạn có ngưỡng lớn trước, ngưỡng bé sau. Nếu độ lớn nằm trong ngưỡng nào thì phân đoạn đang xét thuộc loại tương ứng với ngưỡng đó. Kết thúc quá trình phân đoạn ta thu được chuỗi mã của histogram gồm các ký tự L, M, S, U tùy vào Histogram. Với chuỗi mã thu được, tính hệ số cho chúng như sau
• Phân đoạn loại S: 1 • Phân đoạn loại M: 2 • Phân đoạn loại L: 4 • Phân đoạn loại U: 0
Sau đó trọng số của chuỗi mã được tính như sau
4*|Số lượng mã L| + 2*|Số lượng mã M|+1*|Số lượng mã S|
Áp dụng phương pháp trên cho các khung xương lấy theo chiều ngang và chiều dọc của chữ Nôm ta được chuỗi mã, bổ sung các Điểm ảnh tương đối của khung xương ta thu được chuỗi mã hoàn chỉnh. Cách tính điểm ảnh tương đối của khung xương như sau:
- Iw là chiều rộng ảnh tính theo pixel;
- Ih là chiều cao ảnh tính theo pixel;
- Hh là tập các bin có trong Histogram lấy trên các điểm ảnh thuộc
cạnh ngang của khung xương (H-Histogram);
- Hv là tập các bin có trong Histogram lấy trên các điểm ảnh thuộc
cạnh đứng của khung xương (V-Histogram).
Thuật toán tạo chuỗi mã
v h i H h i H i w i I H I H f1 / / (4.11) (4.12)
Thuật toán được nhóm tác giả Ming-Gang Wen, Kuo-Chin Fan và Chin-Chuan [16] đề xuất như sau:
Bước 1:
Tìm vị trí có giá trị lớn nhất H và chưa được đánh dấu trong biểu đồ Hh hoặc Hv
Gán giá trị của cho biến Total_Pixel và đánh dấu nó trở thành một phần của G
Bước 2:
Nếu không tìm thấy thì quay về bước 9
Bước 3:
Chọn gía trị lớn hơn từ láng giềng của G, đánh dấu nó và thêm nó vào G. Cộng thêm giá trị của nó trên Hh (hoặc Hv) vào biến Total_Pixel
Bước 4:
Nếu độ lớn của G nhỏ hơn khoảng L (length(G) < rangL) thì chuyển về bước 3. Hoặc nếu Total_Pixel lớn hơn hoặc bằng ngưỡng của L (Total_Pixel >=ThresholdL) thì Code[]=’L’, sau đó quay lại bước 1
Ngược lại nếu không rơi vào một trong hai trường hợp trên thì khởi tạo lại G bằng cách bỏ đánh dấu, sau đó gán Total_Pixel =H
Bước 5:
Chọn gía trị lớn hơn từ láng giềng chưa đánh dấu của G, đánh dấu nó và thêm nó vào G.
Cộng thêm giá trị của nó trên Hh (hoặc Hv) vào biến Total_Pixel Bước 6:
Nếu độ lớn của G nhỏ hơn khoảng M (length(G) < rangM) thì chuyển về bước 5 Hoặc nếu Total_Pixel lớn hơn hoặc bằng ngưỡng của M (Total_Pixel >=ThresholdM) thì Code[]=’M’, sau đó Quay lại bước 1
Ngược lại nếu không rơi vào một trong hai trường hợp trên thì khởi tạo lại G bằng cách bỏ đánh dấu, sau đó gán Total_Pixel =H
Bước 7:
Chọn gía trị lớn hơn từ láng giềng của G, đánh dấu nó và thêm nó vào G. Cộng thêm giá trị của nó trên Hh (hoặc Hv) vào biến Total_Pixel
Bước 8:
Nếu độ lớn của G nhỏ hơn khoảng S (length(G) < rangS) thì chuyển về bước 5 Hoặc nếu Total_Pixel lớn hơn hoặc bằng ngưỡng của S (Total_Pixel >=ThresholdS) thì Code[]=’S’, sau đó Quay lại bước 1
Ngược lại nếu không rơi vào một trong hai trường hợp trên thì khởi tạo lại G bằng cách bỏ đánh dấu, sau đó gán Total_Pixel =H
Bước 9:
Gán Hcode[] hoặc Vcode[] bằng Code[], trả về giá trị
Ví dụ:
với chữ lấy ra H-histogram và V- histogram
Sau khi phân đoạn H-histogram ta thu được chuỗi LML Trọng số LML được tính 2*4 + 1*2 = 10
Sau khi phân đoạn V-histogram ta thu được chuỗi M Trọng số M được tính 1*2=2
Số điểm ảnh tương đối được tính ra 3.55
Vậy chuỗi mã hoàn chỉnh thu được là: 3.55 10 2 LML M
Bổ sung chỉ số phân bố nét vào chuỗi mã
Một đặc điểm quan trọng của histogram là nó có thể thể hiện các nét chữ ngang và các nét chữ dọc. Tuy nhiên qua quá trình mã hóa trên, sự thể hiện này đã không còn được duy trì, dẫn tới việc nhận dạng thiếu chính xác. Bảng dưới đây là một ví dụ về sự không thể hiện được các nét ngang và nét dọc trong chuỗi mã. Các chữ 1_0_HanNomA_0_0, 491hann60b_0_1, 475HanNomA_0_0, 490NomNaTong_0_1 trong bảng có phân bố nét dọc rất khác nhau, nhưng kết quả mã hóa vẫn cho ra chuỗi mã giống nhau là “LLMU”.
Bảng 4.1. Sự tương quan giữa chuỗi mã và histogram
Font chữ Ảnh chữ Giả khung Giả khung ngang Histogr am giả khung ngang Giả khung dọc Histogra m giả khung dọc Mã ngang Mã dọc
491hann60b_0_1 LLSU LLMU
475HanNomA_0
_0 LLMU LLMU
490NomNaTong
_0_1 LLMU LLMU
Ở bảng trên ta thấy chuỗi mã dọc của các font chữ trong bảng đều là LLMU nhưng histogram lấy từ giả khung dọc trên mỗi chữ khác nhau khá nhiều. Tương tự vậy, hai chữ 475HanNomA_0_0 và 490NomNaTong_0_1 có mã ngang là LLMU nhưng histogram ngàng lấy từ giả khung của chúng lại khác nhau rất nhiều. Điều này cho thấy nếu chỉ dựa vào chuỗi mã để nhận dạng thì độ chính xác chưa cao. Với cách nhận dạng theo String Edit-distance [8], kết quả thực nghiệm theo K-fold cross validation trên 3 bộ font Hán nôm A, Hán nôm B và Nôm na tông, mỗi bộ lấy hai kiểu chữ (chữ thường và chữ đậm), tổng số mẫu thử là 2970 chữ chia thành 6
tập sau: HanNomA_0_0; HanNomA_0_1; HanNomB_0_0;
HanNomB_0_1; NomNaTong_0_0; NomNaTong_0_1. Qua 6 lần thử nghiệm với cách thử lấy 5 bộ font huấn luyện, 1 bộ font còn lại để nhận dạng, kết quả nhận dạng đúng trung bình đạt 66%, độ nhiễu nhạn dạng khá lớn (có chữ đưa vào nhận dạng, kết quả đưa ra là một tập 12 chữ khác nhau, trong đó có 1 chữ đúng).
Từ thực trạng đó tác giả luận văn đưa ra sáng kiến lấy thêm một đặc trưng nữa bằng cách chia histogram ra thành lưới 10x10. Với histogram dọc, trên mỗi cột từ 1 đến 10 của ô lưới tìm bin có chiều cao cao nhất, chiếu theo chiều ngang của dòng từ 1 đến 10 trên ô lưới, nếu nó cao đến dòng nào thì gán giá trị cho nó bằng chỉ số của dòng đó, kết thúc ta có thêm chuỗi mã thể hiện 10 nét viết chính theo chiều dọc của chữ.