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ẻ

13 0 0
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ẻ

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

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 2

File 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 3

Thự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 4

B5: 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 5

2 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ự.

Ngày đăng: 12/04/2024, 12:12

Tài liệu cùng người dùng

Tài liệu liên quan