2.8.1Hiệu chỉnh góc nghiêng theo phƣơng nằm ngang 2.8.1.1. Thuật toán dùng trọng tâm của số đông
Thuật toán phát hiện góc nghiêng bằng phương pháp này cài đặt đơn giản và thời gian thực hiện nhanh. Thuật toán được mô tả như sau:
B1. Chia ma trận điểm ảnh của từ bị nghiêng thành hai phần bằng nhau, gọi là phần bên trái và phần bên phải.
B2. Trọng tâm của số đông của mỗi phần được tính như sau: Xcentroid = sum(xij * i)/n, Trong đó:
i = 0,..,NC-1; NC là chiều rộng của thành phần j = 0,..,NR-1; NR là chiều cao của thành phần x = {0,1} là giá trị của ma trận
41
n là số điểm nền( phần từ có giá trị 0) của mỗi phần. Ycentroid = sum(yij*j)/n. Trong đó:
i = 0,..,NC-1; NC là chiều rộng của mỗi phần j = 0,..,NR-1; NR là chiều cao của mỗi phần y = {0,1} là giá trị của ma trận
n là số điểm nền( phần từ có giá trị 0) của mỗi phần. Trọng tâm của mỗi phần là:
CoM = ( Xcentroid, Ycentroid)
B3: Sau khi tính tọa độ trọng tâm của mỗi phần, ta nối hai điểm trọng tâm của mỗi phần thành một đường thẳng( Xem hình 2.14)
B4. Độ nghiêng của từ được tính theo công thức: Slope = (y2 – y1) / (x2 –x1) Trong đó
CoMRightComponent = (x2,y2) CoMLeftComponent = (x1,y1)
Và góc nghiêng sẽ được tính bằng công thức[5]:
) ( tan1 slope
B5. Sau khi tìm được góc nghiêng của từ, ta sẽ quay ma trận điểm của từ bị nghiêng một góc (Kết quả quay được thể hiện ở hình 2.15) theo công thức:
X = xcos + ysin
Y = ysin - xcos
Hình 2.14. Xác định trọng tâm của hai thành phần
42
2.8.1.2. Thuật toán dựa trên phân tích Histogram
Gọi A(i,j) là ma trận nhị phân, giá trị 1 biểu diễn 1 điểm của từ, xmax và ymax là chiều rộng và chiều cao của ma trận. Đầu tiên, ta chiếu từ theo chiều ngang để thu được tổng số điểm đen và lưu trữ vào hai ma trận LP và RP theo công thức sau: LP(y) = 2 0 max ) , ( x x y x A RP(y) = max max 2 ) , ( x x y x A (1)
Hình 2.16. Hiệu chỉnh góc nghiêng của từ “about”. (a). Sau khi thực hiện phép chiếu theo ngang; (b). Từ “about” sau khi hiệu chỉnh góc nghiêng
43
Sau đó, ta tìm giá trị lớn nhất trong ma trận LP và RP tương ứng với các giá trị y = yL và y = yR. Từ hai giá trị này, ta sẽ tính các giá trị yL1, yL2 và yR1,yR2 từ giá trị y gần nhất theo hai phía của yL và yR thỏa mãn LP(y) <0.2LP(yL) và RP(y) <0.2RP(yR) theo các quy tắc:
yL1 = y: (LP(y) < 0.2.LP(yL) & y = max(yi)),yi [0,yL]
yL2 = y: (LP(y) < 0.2.LP(yL) & y = min(yi)),yi [yL,ymax] (2) yR1 = y: (RP(y) < 0.2.RP(yR) & y = max(yi)),yi [0,yR]
yR2 = y:(RP(y) < 0.2RP(yR) & y = min(yi)),yi [yR,ymax] Góc nghiêng của từ được tính theo công thức[7]:
) ( tan max 2 2 2 1 1 x y y y yR R L L
Sau khi hiệu chỉnh góc nghiêng, yL1 ≈ yR1 và yL1 ≈ yR2 và đường baseline được tính theo công thức yL1 – yL2.
2.8.2Hiệu chỉnh góc nghiêng theo phƣơng thẳng đứng 2.8.2.1. Thuật toán lập trình động
a.Giới thiệu thuật toán
Khi các ký tự của từ bị nghiêng không có cùng độ nghiêng giống nhau. Nếu ta tìm góc nghiêng cho cả từ thi sau khi chỉnh góc nghiêng, từ vần bị nghiêng. Ví dụ sau đây minh họa điều này:
44
Kỹ thuật hiệu chỉnh góc nghiêng không giống nhau được thực hiện bằng cách ước lượng các góc nghiêng cục bộ theo phương nằm ngang. Sử dụng các đường thẳng nối hai điểm (i,1) và điểm (pi,N) để biểu diễn góc nghiêng tại vị trí i. Các đường thẳng này được gọi là đường thẳng hiệu chỉnh và ký hiệu là ai(pi).
Vấn đề ước lượng góc nghiêng cho các điểm p1, …, pM được quy về tìm hàm mục tiêu: F(p1,…,pi,…,PM) = M i i i i p p f 1 1) | ( (1)
Trong đó: fi(pi | pi1)là hàm ước lượng giá trị của pi khi đã có pi-1. Để cho từ sau khi chỉnh góc nghiêng được trơn, các điểm pi và pi-1 phải thỏa mãn:
0 |pi – pi-1| 2 (2)
|pi - i| W (3)
Trong đó W là hằng số dương để xác định phạm vi của góc nghiêng có thể của từ trong khoảng [tan1(W/N),tan1( W/N)]
Gọi piopt là giá trị ước lượng của pi, ma trận sau khi hiệu chỉnh B = {b(i,j)} thu được bằng cách ánh xạ các điểm trên đường thẳng hiệu chỉnh ai(pi
opt) của A vào cột i của B(Xem hình 2.18).
Các rằng buộc (2) và (3) không chỉ đảm bảo ma trận sau khi quay vẫn trơn mà còn đảm bảo cấu trúc của ký tự không bị thay đổi sau khi ánh xạ.
45 b.Hàm mục tiêu Hàm mục tiêu fi(pi |pi1) là tổng của ba hàm: ) | ( ) 1 ( ) ( ) ( ) | ( i i1 s i i c i i s c i i i1) i p p s p c p p p f (4)
Trong đó svà c là các trọng số không âm và s + c 1
Hàm si(pi) được dùng để tính mức tin cậy của một nét bút dài trên đường thẳng hiệu chỉnh ai(pi). Nét bút thẳng đứng dài sẽ chỉ ra góc nghiêng rõ nhất so với các nét bút khác. Các nét bút thẳng đứng ngắn hoặc các nét bút nằm ngang được coi như ít liên quan tới góc nghiêng của ký tự nên si(pi) được thiết lập giá trị là 0.
Hàm thứ hai ci(pi) được dùng để đo sự khác nhau giữa góc nghiêng của ai(pi) và góc nghiêng trung bình quanh ai(pi). Hàm này xuất phát từ việc quan sát thấy rằng góc nghiêng trung bình trong các vùng nhỏ không khác xa nhiều so với góc nghiêng cục bộ tối ưu.
Hàm ci(pi) được định nghĩa như sau: ci(pi) = -|PiPi |
Trong đó Pi được tính từ góc nghiêng trung bình trong vùng x N có tâm là điểm giữa của ai(pi).(Xem hình 2.19)
46
Hàm cuối cùng i(pi|pi-1) được sử dụng để đo độ trơn của hai góc nghiêng cục bộ tại vị trí i và i-1, được định nghĩa như sau:
Trong đó i(pi) là số lượng điểm đen trên ai(pi), bằng việc tối ưu hóa
) | ( i i1
i p p
góc nghiêng cục bộ tại i và i -1 có khuynh hướng giống nhau.
c.Thuật toán
Hàm mục tiêu (1) với các rằng buộc (2) và (3) muốn tính được giá trị cho pi phải tính trước được giá trị cho pi-1 nhưng không cần giá trị cho pi-2. Gọi gi(pi) là giá trị cực đại tích lũy của fk(pk|pk-1) khi k=i. gi(pi) được viết như sau:
( ) (1 ) ( | ) max ) ( ) ( : 1 1 1 ] 2 , 1 , 0 [ 1 i i s c i i i p p i i c i i s i ip s p c p g p p p g i i
Sau đây là minh họa cài đặt thuật toán[7]. 1 For all pi [1-W,1+W] do 2 g1(p1):= ss1(p1) + cc1(p1)
/*Bắt đầu thủ tục đệ quy*/ 3 for i:=2 to M do
4 for all pi [i-W,i+W] do Begin
5 gi(pi) := max 1( 1) ( | 1) ] 2 , 1 , 0 [ 1 p i i i i i p g p f p p i i 6 bi(pi):= pi-1 7 end 8 popt M := argmax ( ) ] , [ M M W M W M p p g M
9 for i:= M downto 2 do 1: ( opt)
i i opt
i b p
47
2.8.2.2. Hiệu chỉnh góc nghiêng dựa vào Histogram
Ý tưởng của thuật toán xuất phát từ việc quát sát histogram theo phương thẳng đứng của một từ viết thẳng sẽ có đỉnh cao nhất. Do đó ta làm biến dạng từ theo các góc nghiêng khác nhau và giữ góc nghiêng có đỉnh cao nhất. Đó cũng chính là góc nghiêng của từ.
Góc nghiêng của từ theo chiều thẳng đứng được giới hạn nằm trong khoảng [-45,+45], góc nghiêng trong khoảng này là góc ngiêng phổ biến đối với mọi người viết thông thường.
Đối với mỗi góc, ta tính histogram theo phương thẳng đứng(Minh họa trong hình 2.20) và dùng hàm đo để đo chiều cao của đỉnh cao nhất. Góc quay có đỉnh cao nhất sẽ là góc nghiên của từ. Để tăng tốc độ tính toán, mỗi lần quay xong một góc, góc quay tiếp theo sẽ được tăng thêm một ngưỡng là 5. Sau khi tìm được góc quay α tại đó histogram theo phương thẳng đứng là cao nhất. Ta mới xét tiếp các góc quay trong khoảng từ α -5 đến α + 5 để tìm chính xác góc nghiêng. Sau khi tìm được góc nghiêng β ta quay từ nghiêng theo công thức[8]:
x‟ = x – y tan(β) y‟ = y
48
CHƢƠNG 3. CẮT CHỮ VÀ TRÍCH CHỌN ĐẶC TRƢNG
3.1.Cắt từ khỏi dòng văn bản
3.1.1Cắt dựa vào trọng lực
Một từ có thể chỉ gồm một thành phần hoặc nhiều thành phần. Nếu từ có nhiều thành phần thì phân loại các thành phần cùng thuộc một từ.
Với mỗi thành phần c1 và c2, ta xác định trọng tâm của mỗi thành phần. Ta nối một đường thẳng s đi qua trọng tâm của mỗi thành phần, đường thẳng s sẽ đi qua hai điểm ngoài cùng của hai thành phần. Ta tính khoảng cách giữa hai điểm này và gán vào trọng số của đường thẳng s.(Xem hình 3.1)
Sau khi xác định tất cả khoảng cách giữa các thành phần của một dòng, ta lần lượt tính các tham số chiều dài của dòng l, chiều dài trung bình của nétsvà khoảng cách trung bình giữa hai nét thẳng đứng ds:
Chiều dài của dòng l được tính theo công thức: ) ) , ( ( min ) ) , ( (
max p x y black p x y black
x x
l
(1)
Chiều dài trung bình của mỗi nét sđược tính theo công thức:
s
= mediany(hh[y]) (2)
49
Trong đó hh[y] là phép chiếu histogram theo phương nằm ngang. Tham số
s
biểu diễn giá trị trung bình số điểm đen của cả dòng văn bản. Giá trị thứ ba ds
là khoảng cách trung bình giữa các thành phần.
Ngưỡng để tách các từ khỏi dòng văn bản được tính theo công thức[8]: Tseg = s s l d
Trong đó là một hằng số được xác định bằng thực nghiệm. Giá trị thay đổi trong khoảng từ [0.8,1.5]. Với giá trị =1.1 thì kết quả phân tách các từ là tốt nhất.
Kết quả sai khi phân từ
Phân quá Phân thiếu Tổng số
0.8 6.95% 1.07% 8.02% 0.9 4.35% 1.09% 5.38% 1.0 3.62% 1.46% 5.08% 1.1 2.36% 2.08% 4.44% 1.2 2.23% 2.77% 5.03% 1.5 1.39% 6.44% 7.83%
Khi khoảng cách S giữa hai thành phần lớn hơn Tseg thì hai thành phần này thuộc hai từ khác nhau.
50
3.1.2Cải tiến các thuật toán cắt từ
Các phương pháp cắt từ đã đề cập ở trên đều dựa trên nguyên tắc tìm ngưỡng cắt, sau đó kiểm tra xem nếu khoảng trắng giữa hai thành phần lớn hơn ngưỡng cắt thì tiến hành cắt từ, tuy nhiên trong quá trình cắt vẫn cắt nhầm hai từ thành một từ. Sau đây là thuật toán để nâng cao độ chính xác khi tiến hành cắt từ:
Bước đầu tiên, ta xác định ngưỡng cắt bằng một trong các thuật toán nêu trên. Sau đó ta cắt dòng văn bản thành các đoạn. Như vậy mỗi đoạn có thể gồm nhiều từ và khoảng trắng trong các đoạn bị cắt đều nhỏ hơn ngưỡng cắt.
Gọi Silà một đoạn, khoảng trắng của các từ trong Si đều nhỏ hơn khoảng cách giữa Si với Si1 và Si1. Trong Si ta tính khoảng trắng lớn nhất maxgap và tính khoảng trắng bên trái và bên phải Sigọi là leftgap và rightgap. Nếu các giá trị maxgap, leftgap và rightgap thỏa mãn điều kiện[9]:
* maxgap ≥ min{leftgap, rightgap}
thì Sisẽ bị chia thành 2 đoạn tại nơi có độ rộng khoảng trắng là maxgap. Thuật toán kết thúc khi biểu thức (1) không còn được thỏa mãn.
Gọi WER(Word extraction rate) là tỉ lệ phân tách từ được tính theo công thức:
51
GA(Gap accurate rate) là tỉ lệ phân loại khoảng trắng chính xác được tính theo công thức:
Bảng thực nghiệm sau đây sẽ đánh giá kết quả thực hiện thuật toán[9].
Độ đo Ngưỡng tách Giá trị
WER Cố định
Xác định bằng thuật toán ước lượng
86.42 86.58
GA Cố định
Xác định bằng thuật toán ước lượng
87.50 87.73
3.1.3Biểu diễn các cụm ký tự và dấu
Trong tiếng Việt, mỗi từ có thể có nhiều dấu đi kèm, các dấu này sẽ được sử dụng để tăng độ chính xác trong quá trình cắt ký tự khỏi từ. Các dấu sẽ được xác định bằng các cách như đếm số điểm, so sánh vị trí của nó với đường baseline giữa và đường baseline dưới.
Sau khi đã tách các từ khỏi dòng văn bản, ta sẽ xác định xem các dấu của ký tự sẽ nằm ở cụm ký tự nào. Để thực hiện được, ta sẽ xác định hình chữ nhật nhỏ nhất bao quanh cụm ký tự và các dấu của từ. Sau đó kiểm tra xem dấu thuộc cụm ký tự nào theo các quy tắc:
Nếu hai giá trị xd1,xd2 của hình chữ nhật chứa dấu nằm trong xh11,xh21 của hình chữ nhật chứa cụm ký tự thì dấu đang xét được gán cho cụm ký tự đó.
52
Nếu hai giá trị xd1,xd2 của hình chữ nhật chứa dấu giao với xh11,xh12
và xh21,xh22 của hai cụm ký tự liên tiếp thì dấu đó được gán cho cụm ký tự có khoảng cách giữa xd1 tới xhi1 gần nhất(i=1,2).
Trong đó (xd1,yd1),(xd2,yd2) là hai điểm biểu diễn hình chữ nhất nhỏ nhất chứa đấu. (xh11,yh11),( xh12,yh12) là hai điểm biểu diễn hình chữ nhật chứa cụm ký tự.
3.2.Cắt các ký tự khỏi từ
3.2.1Ƣớc lƣợng chiều rộng và cao của ký tự
Trong các thuật toán cắt từ, chiều rộng và chiều cao ước lượng của ký tự được sử dụng để kiểm tra xem một điểm p có khả năng là điểm cắt hay không bằng cách so sánh khoảng cách từ điểm p tới điểm cắt gần nhất với chiều rộng trung bình của một ký tự.
Chiều cao trung bình của một ký tự được xác định bằng cách tính khoảng cách giữa đường baseline dưới và đường baseline trên. Chiều rộng trung bình của một ký tự được xác định bằng lấy chiều cao trung bình của ký tự nhân với
Hình 3.4. Hình chữ nhật nhỏ nhất chứa dấu và cụm ký tự
53
hằng số ( được xác định bằng thực nghiệm). Một cách khác để xác định chiều rộng trung bình của một ký tự là xác định các ký tự được viết riêng lẻ trung cả một câu và tính trung bình chiều rộng của chúng.
3.2.2Cắt bằng thuật toán mẹo
Trong nhận dạng chữ viết tay trực tuyến, chúng ta có thể phát hiện được cụm các ký tự tạo nên từ. Đối với nhận dạng chữ viết tay offline, khi các cụm từ này đè lên nhau, sẽ không phát hiện được từ được viết gồm nhiều cụm từ tạo nên. Ví dụ khi ta viết từ “chúng”
Như vậy đối với chữ viết tay, kết quả phân tách từ sẽ cho độ chính xác cao hơn so việc phân tách từ trong chữ viết tay offline. Ta đã có các điểm cắt tiềm năng lầ kết thúc của các nét bút Như ví dụ trên chúng ta đã có các điểm cắt kết thúc của 3 cụm “Chu”, “un” và “g”.
Thuật toán mẹo được thực hiện bằng cách duyệt qua các cụm từ để tìm các cung hoặc các điểm chiếu theo phương thẳng đứng có số điểm đen là ít nhất. Trong nhiều trường hợp các cung sẽ là nơi quyết định điểm cắt, tuy nhiên trong một số trường hợp các cung sẽ không có điểm cắt tại đó ví dụ như như tại các ký tự “a”, “u” và “o”. Để tránh trường hợp cắt nhầm trong các trường hợp này ta phải kết hợp với thủ tục tìm đường cong. Khi tìm thấy một cung, ta kiểm tra
54
xem việc cắt có phân ký tự thành hai phần hay không. Nếu đường cong của ký tự được tìm thấy thì không tiến hành cắt.
Mỗi khi tìm được điểm cắt ta cũng kiểm tra xem điểm cắt có gần với điểm cắt trước đó hay không. Nếu như quá gần điểm cắt trước đó thì điểm cắt cũng bị