Tải bản đầy đủ (.docx) (13 trang)

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ẻ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (98.21 KB, 13 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>[Thuật toán] [OCR] </b>

<b>Xác định các dịng ký tự vàdị tìm các ký tự riêng lẻ</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

File hình ảnh đã đc xử lý phông nền (background) & nhiễu (noise)

<b>Mô tả</b>

: 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ý

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>Thực hiện</b>

:

<b>1. Xác định các dòng ký tự:</b>

Đế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: <small>●</small> Đỉnh dịng ký tự (Line Top)

<small>●</small> Đá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:

<b>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</b>

<b>B2: for ( y ; x</b>

<i><b>→Img.Width;) //trên cùng dòng điểm ảnh y, duyệt qua trục x cho đến hết </b></i>

<i>chiều rộng của bức ảnh</i>

<b>a. if color(x,y)==black { LineTop</b><i><b>=y;} //nếu tìm thấy điểm ảnh màu đen, thì tìm </b></i>

<i>ra Đỉnh dịng Ký tự</i>

<i><b>b. else { x++; } //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục x</b></i>

<i><b>c. if x==Img.Width {y++; x=0;} //nếu đã duyệt qua hết chiều rộng của bức ảnh </b></i>

<i>thì chuyển sang dòng điểm ảnh y tiếp theo, tại điểm ảnh x đầu tiên</i>

<b>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 </b>

<i>điểm ảnh dưới Đỉnh dòng Ký tự</i>

<b>B4: for ( y ; x</b>

<i><b>→Img.Width; ) //trên cùng dòng điểm ảnh y, duyệt qua trục x cho đến hết</b></i>

<i>chiều rộng của bức ảnh</i>

<b>a. if color(x,y)!=Black { LineBottom</b><i><b>=y-1; NumOfLine++;} //nếu hết dòng điểm</b></i>

<i>ả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</i>

<i><b>b. else { y++; x=0; } //ngược lại thì chuyển sang dòng điểm ảnh y tiếp theo, tại </b></i>

<i>điểm ảnh x đầu tiên</i>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

<b>B5: Loop(B1 </b>

<i><b>→ B4) //lặp lại các bước trên cho đến khi tìm hết các Dòng Ký tự</b></i>

<b>B6: if y==Img.Height { Stop; } //Nếu đạt đến chiều cao của bức ảnh thì dừng lại</b>

<b>Đố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ị </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

Ngồ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.

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b>2. Dị tìm các ký tự riêng lẻ</b>

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: <small>●</small> Đỉnh Ký tự (Character Top)

<small>●</small> Đáy Ký tự (Characer Bottom) <small>●</small> Cạnh trái Ký tự (Character Left) <small>●</small> Cạnh phải Ký tự (Character Right)

<i><b>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</b></i>

<b>B2: y fix; x→</b><i><b>Img.Width; //cố định dòng điểm ảnh y, duyệt qua trục x cho đến hết chiều </b></i>

<i>rộng của bức ảnh</i>

<i><b> a. if color(x,y)==Black { LineTop=CharacterTop=y;} //nếu tìm thấy điểm ảnh </b></i>

<i>màu đen, thì tìm ra Đỉnh dòng Ký tự, cũng là Đỉnh Ký tự</i>

<i><b> b. else { x++;} //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục x</b></i>

<b>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</b>

<i><b>→LineBottom; ) //trên cùng cột điểm ảnh x, duyệt theo trục y cho đến </b></i>

<i>hết chiều cao của bức ảnh</i>

<b>a. if color(x,y)==black { CharacterLeft</b><i><b>=x; } //nếu tìm thấy điểm ảnh màu đen, </b></i>

<i>thì tìm ra Cạnh trái Ký tự</i>

<i><b>b. else { y++; } //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục y</b></i>

<i><b>c. if y==LineBottom { x++; y=LineTop; } //nếu đã duyệt qua hết chiều cao của </b></i>

<i>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ự</i>

<b>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</b>

<i><b>→LineBottom; ) //trên cùng cột điểm ảnh x, duyệt theo trục y cho đến </b></i>

<i>hết chiều cao của bức ảnh</i>

<b>a. if color(x,y)!=black { CharacterRight=x-1;} //nếu khơng tìm thấy điểm ảnh </b>

mà đen nào, thì Cạnh trái Ký tự được tìm thấy

<i><b>b. else { x++, y=LineTop; } //ngược lại thì chuyển sang cột điểm ảnh x tiếp theo,</b></i>

<i>tại điểm ảnh y đầu tiên</i>

<b>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</b>

<i><b>→CharacterRight; ) //trên xùng dòng điểm ảnh y, duyệt qua trục x cho </b></i>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<i>đến hết Cạnh phải Ký tự </i>

<b>a. if color(x,y)==black { CharacterTop</b><i><b>=y; } //nếu tìm thấy điểm ảnh màu đen, </b></i>

<i>thì tìm ra Đỉnh Ký tự</i>

<i><b>b. else { x++; } //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục x</b></i>

<i><b>c. if x==CharacterRight { y++; x=CharacterLeft; } //nếu đã duyệt qua hết Cạnh</b></i>

<i>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ự</i>

<b>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</b>

<i><b>→CharacterRight; ) //trên cùng dòng điểm ảnh y, duyệt qua trục x cho </b></i>

<i>đến hết Cạnh phải Ký tự</i>

<b>a. if color(x,y)==black { CharacterBottom</b><i><b>=y; } //nếu tìn thấy điểm ảnh màu </b></i>

<i>đen, thì tìm ra Đáy Ký tự</i>

<i><b>b. else { x++; } //ngược lại thì duyệt qua điểm ảnh kế tiếp theo trục x</b></i>

<i><b>c. if x==CharacterRight { y--; x=CharacterLeft; } //nếu đã duyệt qua hết Cạnh </b></i>

<i>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ự</i>

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

</div>

×