Đầu vào S = ((x0,y0,p0), (x1,y1,p1), (x2,y2,p2), ..., (xn,yn,pn)) chứa lỗi do quá trình sửa lỗi của người viết gây ra sẽ được chuyển thành dạng S* = ((x*0,y*0,p*0), (x*1,y*1,p*1), (x*2,y*2,p*2), ..., (x*n,y*n,p*n)) có thể được nhận dạng được. Trong S* tất các các tọa độ của một ký tự sẽ được nối với một ký tự khác(nếu có) theo thứ tự tạo nên chữ và các lỗi viết tay sẽ bị xóa khỏi tập S .
Hình 2.4. Ví dụ về sửa lỗi “Xóa”
Hình 2.5. Ví dụ về sửa lỗi “Viết đè”
29
Việc nhận dạng xem người dùng hiệu chỉnh lỗi theo một trong 3 loại nào kể trên khó hơn nhiều so với việc xử lý ký tự bị “làm chậm”. Ví dụ, chúng ta không thể xác định được nét bút bị trễ khi viết ký tự t và việc xóa ký tự viết sai “l” bằng cách gạch ngang qua ký tự qua nó mà không sử dụng các thông tin về ngữ cảnh hoặc các thông tin phản hồi từ người viết.
Để giải quyết các vấn đề trên, chúng ta xử lý lỗi chỉnh sửa tại mức tiền xử lý. Như vậy trong quá trình tương tác với người viết, hệ thống có thể xử lý các lỗi chỉnh sửa của người viết tại mức tiền xử lý. Chúng ta sử dụng các thuật toán heuristics để phát hiện, phân loại và xử lý các lỗi do người dùng hiệu chỉnh lỗi mặc dù có thể việc xử lý này có thể không mang lại thành công( Chiếm tỉ lệ ít hơn so với khả năng thành công). Việc sử dụng các thuật toán heuristics sẽ giúp chúng ta cài đặt nhanh hơn và đáp ứng được bộ nhớ cũng như tốc độ xử lý của các các thiết bị cầm tay có tốc độ xử lý và bộ nhớ đang còn hạn chế.
Để giảm việc xử lý và và nâng cao độ chính xác khi xử lý các lỗi do người viết chỉnh sửa chúng ta cũng có thể cung cấp các cơ chế hiệu chỉnh lỗi khác nhau để tăng khả năng mềm dẻo của chương trình. Xem xét tình huống nếu người viết viết ký tự „l” và viết tiếp nét gạch nganh lên ký tự đó trước khi ký tự đó được nhận dạng, sẽ rất khó để ta có thể phát hiện tình huốn đó có phải thuộc loại chỉnh sửa “Xóa” hay không. Nhưng nếu người dùng gạch ngang 3 gạch thì chúng ta có thể xếp loại ký tự đó thuộc loại chỉnh sửa “Xóa”.
Để chuyển S thành S*, hệ thống phải xác định được các điểm cần phải loại bỏ khỏi tập S và các cặp tọa độ cần phải được chèn vào các vị trí khác. Trong trường hợp xóa, các tọa độ thuộc ký tự hay cả từ bị xóa phải bị loại bỏ. Trong trường hợp viết đè, ta phải loại bỏ phần bị viết đè khỏi dãy các điểm trong S và phần viết đè sẽ được chèn vào vị trí thích hợp trong dãy. Trong trường hợp “chèn” hoặc “hoàn thiện”, ta không phải xoá bất kỳ toạ độ nào trong S mà chỉ cần chèn các điểm mới vào vị trí thích hợp trong S. Việc loại bỏ các điểm và chèn thêm các điểm vào được thực hiện trong trong sự kiện Pen-Up.
30
Người viết viết các ký tự theo chiều từ trái sang phải. Dựa vào đặc điểm này ta sẽ phân loại tất cả các nét bút trong dãy S thành các cặp “nét hiệu chỉnh” và “nét không hiệu chỉnh”. Mỗi khi người viết kết thúc một nét bút, ta sẽ tính toán các đặc trưng của nét bút này và so sánh nó với đặc trưng của các nét đã được viết trước đó. Nếu nét bút viết mới có đặc trưng không phù hợp với các đặc trưng của các nét đã viết trước đó, chúng ta sẽ phân loại nó là “nét hiệu chỉnh”. Ví dụ nét bút thứ i được xem là nét hiệu chỉnh nếu:
} ,..., { min . min1 min5 min i i i x x x Trong đó min i
x là giá trị x nhỏ nhất của nét bút thứ i trong S và là một giá trị ngưỡng được xác định bằng thực nghiệm.
Thủ tục phân loại và xử lý hiệu chỉnh xoá, ghi đè, hoàn thiện và chèn được minh hoạ trong hình 2.7.
Xử lý hành động “Xoá”
Kiểm tra hiệu chỉnh Xoá
Xoá nét bút
? Kiểm tra hiệu
chỉnh
Ghi đè
Kiểm tra hiệu chỉnh Hoàn thiện/Chèn ? Ch èn né t b út Xử lý hành động “Ghi đè”
Hình 2.7. Sơ đồ xử lý hiệu chỉnh tổng quát
Nét bút là nét bút hiệu chỉnh Nét bút được bao bởi nét bút hiệu chỉnh
31
Đầu tiên, hệ thống kiểm tra xem nét bút có phải là nét bút xoá hay không. Việc kiểm tra sẽ được thực hiện bằng cách so sánh đặc trưng của nét bút được xem là hiệu chỉnh với tất cả các nét bút còn lại. Nết có sự khác biệt lớn khi so sánh, nét bút hiệu chỉnh này sẽ được xem là nét bút “Xoá”. Thuật toán mẹo sau đây dùng để kiểm tra xem nét bút hiệu chỉnh có phải là nét bút “Xoá” hay không. | | max . | | max 1 1 1 1 n i n i i r j r j j x x x x
Trong đó là hằng số ngưỡng được xác định bằng thực nghiệm, n i
x là giá trị x của điểm thứ i trong tập các nét được coi là không hiệu chỉnh tại đó có sự thay đổi hướng viết từ trái qua phải hoặc ngược lại, r
j
x là giá trị x của điểm j trong nét hiệu chỉnh.
Thuật toán mẹo đề cập ở trên sẽ bỏ qua những nét có số lượng điểm ít. Trong trường hợp xóa một ký tự của một từ, chúng ta sử dụng thuật toán mẹo sau để kiểm tra:
Với mỗi nét bút được phân loại là nét hiệu chỉnh, ta kiểm tra số điểm của nét hiệu chỉnh, nếu thấy số điểm tạo thành nét hiệu chỉnh nhiều hơn số điểm của một nét bút thông thường, thì nét bút ấy được phân loại là nét “Xóa”.
Nếu R là tập các điểm của nét được coi là nét hiệu chỉnh và R_ là tập các điểm nằm trên cùng vùng trong R. Khi đó R được coi là nét xóa nếu:
Số lượng điểm trong R > . Số lượng các điểm trong _
R
Trong đó là một ngưỡng cố định.
Như vậy nét bút hiệu chỉnh được coi là nét bút “Xóa” được phân loại thành 2 loại:
Là nét bút dài, có ít điểm
Nhiều nét bút cùng nằm trên một vùng
Nếu nét bút hiệu chỉnh không được xét là nét “Xóa”, chúng ta sẽ kiểm tra xem nét bút đó có phải là nét viết đè hay không bằng cách so sánh hình chữ
32
nhật bao quanh nét bút hiệu chỉnh với hình chữ nhật của các nét bút còn lại. Nếu thấy có sự giao nhau nhiều giữa hai hình chữ nhật, nét bút hiệu chỉnh đó có thể được coi là nét bút viết đè.
Sau khi phát hiện ra nét bút hiệu chỉnh là nét bút viết đè. Tiếp theo ta phải chèn nét bút viết đè vào vị trí thích hợp.Vị trí này được xác định bằng cách xác định vùng chứa hai điểm thấp nhất của vùng bị đè.
Nếu nét bút hiệu chỉnh không được phân loại là nét xóa hoặc nét viết đè, nét bút hiệu chỉnh đó sẽ được xem là nét bút chèn hoặc nét bút hoàn thành. Nét bút hiệu chỉnh đó sẽ được chèn vào vị trí thích hợp trong S.