Mô tả: tiến hành việc xác định các dòng ký tự trong file hình ảnh cũng như các ký tự trên từng dòng Cách gọi tên các ký tự Latinh chuẩn ● ký tự thấp: w, e, r, u, o, a, s, z, x, c, v, n, m ● ký tự có đáy: q, y, p, g ● ký tự cao: d, f, h, k, l, b, và tất cả các ký tự IN HOA và chữ số ● ký tự vừa: t ● ký tự có dấu lửng: i, j ● ký tự dấu: ` ~ % ( ) _ = + { } \ | ; : < > , . ?
Trang 1[Thuật toán] [OCR]
Xác định các dòng ký tự vàdò tìm các ký tự riêng lẻ
Trang 2File hình ảnh đã đc xử lý phông nền (background) & nhiễu (noise)
Mô tả: tiến hành việc xác định các dòng ký tự trong file hình ảnh cũng như các ký
Trang 3Thực hiện:
1 Xác định các dòng ký tự:
Đếm các dòng ký tự trong một bức ảnh chứa các ký tự là điều quan trọng trong việc giới hạn các ranh giới mà việc dò tìm có thể thực hiện bên trong đó Vì thế, việc dò tìm ký tự sau này trong một bức ảnh sẽ không cần thiết bao gồm việc quét qua toàn bộ bức ảnh một lần nữa.
Đối với việc xác định dòng ký tự, chúng ta chỉ quan tâm đến 2 thuộc tính: ● Đỉnh dòng ký tự (Line Top)
● Đáy dòng ký tự (Line Bottom).
Việc xác định này cần phải tiến hành quét qua từng dòng điểm ảnh (pixel line) trong tập tin ảnh cần phân tích:
B1: x=y=0; NumOfLine=0; //Bắt đầu tại điểm (0,0), số Dòng Ký tự tìm được là 0
B2: for ( y ; x→Img.Width;) //trên cùng dòng điểm ảnh y, duyệt qua trục x cho đến hết
chiều rộng của bức ảnh
a if color(x,y)==black { LineTop=y;} //nếu tìm thấy điểm ảnh màu đen, thì tìm
ra Đỉnh dòng Ký tự
b else { x++; } //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục x
c if x==Img.Width {y++; x=0;} //nếu đã duyệt qua hết chiều rộng của bức ảnh
thì chuyển sang dòng điểm ảnh y tiếp theo, tại điểm ảnh x đầu tiên
B3: x=0; y=LineTop; //Bắt đầu tìm Đáy dòng Ký tự tại điểm ảnh đầu tiên của dòng
điểm ảnh dưới Đỉnh dòng Ký tự
B4: for ( y ; x→Img.Width; ) //trên cùng dòng điểm ảnh y, duyệt qua trục x cho đến hết
chiều rộng của bức ảnh
a if color(x,y)!=Black { LineBottom=y-1; NumOfLine++;} //nếu hết dòng điểm
ảnh y mà không tìm thấy điểm ảnh màu đen nào, thì tìm ra Đáy dòng Ký tự Tăng số Dòng Ký tự thêm 1
b else { y++; x=0; } //ngược lại thì chuyển sang dòng điểm ảnh y tiếp theo, tại
điểm ảnh x đầu tiên
Trang 4B5: Loop(B1 → B4) //lặp lại các bước trên cho đến khi tìm hết các Dòng Ký tự
B6: if y==Img.Height { Stop; } //Nếu đạt đến chiều cao của bức ảnh thì dừng lại
Đối với dòng KHÔNG có ký tự cao, nếu xuất hiện thêm ký tự có dấu lửng thì dễ bị
nhầm lẫn thành 2 dòng ký tự do dấu lửng của ký tự có dấu lửng
Ngoài ra, chúng ta cần bổ sung thêm cho bước B4 trường hợp dòng ký tự cuối cùng chạm mép hay bị cắt ngang do giới hạn của chiều cao bức ảnh.
Trang 52 Dò tìm các ký tự riêng lẻ
Việc dò tìm các ký tự riêng lẻ sẽ gao gồm việc quét qua các dòng ký tự để cho ra các ảnh riêng biệt với các điểm ảnh màu đen
Việc dò từng ký tự trên dòng ký tự thì lại phụ thuộc vào 4 thuộc tính: ● Đỉnh Ký tự (Character Top)
● Đáy Ký tự (Characer Bottom) ● Cạnh trái Ký tự (Character Left) ● Cạnh phải Ký tự (Character Right)
B1: x=0; y=LineTop; //bắt đầu tại Đỉnh dòng ký tự đầu tiên và điểm ảnh x đầu tiên
B2: y fix; x→Img.Width; //cố định dòng điểm ảnh y, duyệt qua trục x cho đến hết chiều
rộng của bức ảnh
a if color(x,y)==Black { LineTop=CharacterTop=y;} //nếu tìm thấy điểm ảnh
màu đen, thì tìm ra Đỉnh dòng Ký tự, cũng là Đỉnh Ký tự
b else { x++;} //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục x
B1: x=0; y=LineTop; //bắt đầu tại Đỉnh dòng ký tự tìm được và điểm ảnh x đầu tiênB2: for ( x ; y→LineBottom; ) //trên cùng cột điểm ảnh x, duyệt theo trục y cho đến
hết chiều cao của bức ảnh
a if color(x,y)==black { CharacterLeft=x; } //nếu tìm thấy điểm ảnh màu đen,
thì tìm ra Cạnh trái Ký tự
b else { y++; } //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục y
c if y==LineBottom { x++; y=LineTop; } //nếu đã duyệt qua hết chiều cao của
bức ảnh thì chuyển sang cột điểm ảnh x tiếp theo, tại điểm ảnh y là Đỉnh dòng Ký tự
B3: x=CharacterLeft; y=LineTop; //bắt đầu tại Cạnh trái Ký tự và Đỉnh dòng Ký tựB4: for ( x ; y→LineBottom; ) //trên cùng cột điểm ảnh x, duyệt theo trục y cho đến
hết chiều cao của bức ảnh
a if color(x,y)!=black { CharacterRight=x-1;} //nếu không tìm thấy điểm ảnh
mà đen nào, thì Cạnh trái Ký tự được tìm thấy
b else { x++, y=LineTop; } //ngược lại thì chuyển sang cột điểm ảnh x tiếp theo,
tại điểm ảnh y đầu tiên
B5: x=CharacterLeft; y=LineTop; //bắt đầu tại Cạnh trái Ký tự và Đỉnh dòng Ký tựB6: for ( y ; x→CharacterRight; ) //trên xùng dòng điểm ảnh y, duyệt qua trục x cho
Trang 6đến hết Cạnh phải Ký tự
a if color(x,y)==black { CharacterTop=y; } //nếu tìm thấy điểm ảnh màu đen,
thì tìm ra Đỉnh Ký tự
b else { x++; } //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục x
c if x==CharacterRight { y++; x=CharacterLeft; } //nếu đã duyệt qua hết Cạnh
phải Ký tự thì chuyển sang dòng điểm ảnh y tiếp theo, tại điểm ảnh x là Cạnh trái Ký tự
B7: x=CharacterLeft; y=LineBottom; //bắt đầu tại Cạnh trái Ký tự và Đáy dòng Ký tựB8: for ( y ; x→CharacterRight; ) //trên cùng dòng điểm ảnh y, duyệt qua trục x cho
đến hết Cạnh phải Ký tự
a if color(x,y)==black { CharacterBottom=y; } //nếu tìn thấy điểm ảnh màu
đen, thì tìm ra Đáy Ký tự
b else { x++; } //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục x
c if x==CharacterRight { y ; x=CharacterLeft; } //nếu đã duyệt qua hết Cạnh
phải Ký tự thì chuyển sang dòng điểm ảnh y bên trên, tại điểm ảnh x là Cạnh trái Ký tự
Lặp lại các bước trên để tìm cho hết các ký tự của Dòng Ký tự.