CHƯƠNG 3. CÀI ĐẶT HỆ THỐNG NHẬN DẠNG CHỮ VIẾT TAY HẠN CHẾ
3.2. Quá trình tiền xử lý
3.2.2. Căn chỉnh độ lệch trang văn bản
Như đã đề cập, việc hiệu chỉnh độ lệch trang văn bản gồm hai thao tác cơ bản đó là phát hiện góc nghiêng của trang văn bản và xoay lại văn bản cho thẳng (góc nghiêng của văn bản bằng 00). Để tính góc nghiêng của trang văn bản, ở đây chúng tôi sử dụng thuật toán biến đổi Hough. Ý tưởng cơ bản của phương pháp này là dựa
vào thuật toán biến đổi Hough, ta xác định một đường thẳng dài nhất trên trang văn bản. Đường thẳng này chính là thành phần định hướng của văn bản. Trong thực tế, đường thẳng này thường không liên tục và ta coi đường thẳng dài nhất trong văn bản là đường thẳng tập trung nhiều điểm ảnh nhất (điểm đen). Quá trình thực hiện cụ thể như sau:
Tất cả các đường thẳng đi qua mỗi điểm (x,y) trong một ảnh đều có dạng: y = mx+c, với các giá trị m và c khác nhau. Biểu thức này cùng có thể viết dưới dạng c
= -mx+y, trong đó x và y là các hằng số, c và m là các biến.
Khi đó mỗi điểm trong không gian (x,y) sẽ tương ứng với một đường thẳng trong không gian (m,c).
Với bất kỳ đường thẳng nào đi qua điểm (x,y) đều tương ứng với một điểm trong không gian (m,c) và tất cả các đường thẳng đi qua một điểm ảnh trong không gian (x,y) sẽ tạo nên một đường thẳng tương ứng trong không gian (m,c).
Giao điểm của hai đường thẳng được tạo ra trong không gian (m,c) sẽ tương ứng với đường thẳng đi qua hai điểm ảnh trong không gian (x,y).
Nếu n điểm trong không gian (x,y) cùng nằm trên một đường thẳng, thì n đường thẳng tương ứng trong không gian (m,c) sẽ cắt nhau tại một điểm mà tương ứng với đường thẳng đó trong không gian (x,y).
Từ đó, ta xác định đường thẳng như sau:
Ta coi không gian (m,c) là một mảng hai chiều.
Tất cả các phần tử của mảng này đều được khởi tạo bằng 0.
Đối với mỗi điểm ảnh đen (x,y), ta thêm 1 vào phần tử (m,c) của mảng sao cho thoả mãn: y= mx+c
Tìm các giá trị lớn trong mảng, mỗi giá trị lớn tương ứng với một đường thẳng.
Để dễ tính toán hơn, ta chuyển phương trình của đường thẳng về dạng:
Mỗi cặp (, R) xác định một đường thẳng trong không gian (x,y). Biến xác định góc nghiêng của đường thẳng. Với mỗi góc cho trước, biến R xác định khoảng cách giữa điểm (0,0) và đường thẳng đi qua (x,y) với góc nghiêng .
Thuật toán được mô tả cụ thể hơn như sau:
INPUT: Ảnh văn bản cần nhận dạng OUTPUT: Độ nghiêng của trang văn bản PROCESS:
Bước 1: Tạo mảng lưu trữ, đường thẳng dài nhất trong ảnh là đường chéo:
allocate AccArray[-45..45 step 0.5, 0..image_diagonal_length]
Bước 2:Duyệt tất cả các pixel trên ảnh. Với mỗi điểm ảnh (không phải điểm nền) (x,y), thực hiện các bước sau:
2.1) for = -450 to 450step 0.5;
2.2) r = x*cos(*PI/360) + y*sin(*PI/360);
2.3) if r 0 then AccArray[, round(r)]++;
Bước 3: Tìm kiếm các giá trị lớn nhất trong mảng AccArray (góc tương ứng là góc của đường thẳng chúng ta đang tìm kiếm)
Bước 4: return
Thuật toán 3-1: Thuật toán xác định góc nghiêng trang văn bản
Vì mỗi ảnh được tạo thành từ các pixel, mà các pixel có toạ độ dương nên ta có thể xem xét R với các giá trị dương. Giá trị lớn nhất của R có thể là độ dài của đường chéo. Như vậy, không gian giá trị R sẽ là các giá trị dương giữa 0 và chiều dài đường chéo của ảnh. Chúng ta có thể bỏ qua các giá trị âm (những đường thẳng nằm trên điểm (0,0)) bởi vì dù sao thì chúng cũng chỉ đi qua một góc của ảnh. Góc nghiêng của văn bản thường nằm trong khoảng từ -450đến 450(nếu một trang văn bản mà nghiêng quá 450thì có thể coi là nằm ngang). Như vậy khoảng góc có thể chia thành 180 phần với độ chính xác là 0.50. Do đó, góc chỉ có thể nằm trong
khoảng từ -45 đến -45 với mỗi bước tăng là 0.5 . Việc tìm kiếm các giá trị lớn nhất trong mạng nhằm đảm bảo rằng trang ảnh chúng ta đang xét không phải là trang trắng (ở đây chọn tối thiểu là 10 giá trị, như vậy một văn bản phải có ít nhất là 10 dòng, tương ứng với ít nhất là 10 giá trị có thể có). Với một dòng các kí tự trong ảnh, sẽ có rất nhiều đường thẳng có khả năng được lựa chọn. Vậy thì đường thẳng nào là đường thẳng xác định hướng của văn bản? Chúng ta cũng không thể nói rằng ảnh cần phải được tiền xử lý trước khi cung cấp cho thuật toán. Một ý tưởng đã được đề xuất trong [10] là thay thế tất cả vùng liên thông (liên thông bốn) được tạo bởi các điểm đen bằng một điểm đã được lựa chọn trước. Có nhiều giải pháp để lựa chọn điểm này, cách đơn giản nhất là chọn các điểm có toạ độ y là nhỏ nhất (nếu có nhiều hơn một điểm có toạ độ y là nhỏ nhất thì lựa chọn điểm có toạ độ x là nhỏ nhất), cách lựa chọn này có nhược điểm là đối với các góc nghiêng lớn thì các điểm đại diện cho một dòng văn bản có thể sẽ không thực sẽ thẳng hàng. Ngoài ra, có thể chọn điểm trọng tâm của vùng liên thông (toạ độ điểm trọng tâm của vùng liên thông được tính bằng trung bình các toạ độ x và y lớn nhất và nhỏ nhất của các điểm trong ảnh).
Một vùng liên thông tương đương với một kí tự của văn bản. Do các điểm ảnh kết quả trên một dòng có thể không được sắp thẳng hàng một cách tuyệt đối trên một đường thẳng (do quá trình quét có thể làm biến dạng ảnh). Như vậy, việc tính đến các điểm ảnh láng giềng xung quanh điểm ảnh được lựa chọn trong một vùng liên thông sẽ hiệu quả hơn.
Sau khi đã xác định được độ nghiêng của trang văn bản, cần phải xoay lại trang văn bản cho thẳng (góc nghiêng của trang văn bản bằng 0). Thuật toán xoay ảnh ở đây được thực hiện đơn giản bằng cách chuyển từ toạ độ ảnh sang toạ độ cực, sau đó tiến hành xoay ảnh đi một góc (góc nghiêng của trang văn bản đã được xác định, được tính theo đơn vị radians) xung quanh tâm của ảnh. Thuật toán xoay lại trang văn bản được thực hiện như sau:
INPUT:
- Ảnh của trang văn bản cần nhận dạng (ảnh bị nghiêng).
- Góc nghiêng của trang ảnh (theo radian).
OUTPUT:
ảnh đã được xoay đi một góc (ảnh không bị nghiêng).
PROCESS:
1) newwidth = abs((oldwidth*cos())) + abs((oldheight*sin()));
2) newheight = abs((-oldwidth*sin())) + abs((oldheight*cos()));
3) for y = 0 to newheight for x = 0 to newwidth{
3.1) new_x = (x - halfnewwidth)*cos() + (y -halfnewheight)*sin();
3.2) new_y = (-((x - halfnewwidth)*sin()) + (y -halfnewheight)*cos());
3.3) new_x = new_x + halfoldwidth; //xuất phát từ tâm của ảnh 3.4) new_y = new_y + halfoldheight;
3.5) if(get_pixel_value(oldImage, ny, nx) = =1) set_pixel_value(newImage, y, x, 1) else set_pixel_value(newImage, y, x, 0);
} 4) return newImage
Thuật toán 3-2: Thuật toán xoay ảnh
Kết quả thực nghiệm của quá trình căn chỉnh độ lệch trang văn bản được thể hiện trên Hình 3.2
a) ảnh đầu vào bị nghiêng b) ảnh sau khi được căn chỉnh độ lệch Hình 3.2: Ảnh đầu vào và đầu ra của thuật toán căn chỉnh độ lệch trang văn bản