Trang 1 trên tổng số 2 12 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 12 kết quả

Đề tài: Kỹ Thuật Nhận Dạng Chữ Viết Tay - Phương pháp và các thực hiện trên C#

  1. #1
    Ngày gia nhập
    08 2011
    Bài viết
    98

    Mặc định Kỹ Thuật Nhận Dạng Chữ Viết Tay - Phương pháp và các thực hiện trên C#

    Bài viết này tôi xin trình bày kỹ thuật nhận dạng chữ viết tay bằng phương pháp phân tích đường đi của nét chữ(stroke based):

    Bài viết này hy vọng sẽ giúp các bạn có được cách nhìn tích cực về cách thức nhận dạng chữ viết tay.
    Một phương pháp khác là dùng PCA,các bạn xem topic sau

    Thuật toán PCA trong vấn đề nhận dạng ảnh


    NNLT tôi dùng là C# trên nền Console cho dễ minh họa,các bạn có thể áp dụng cho các nnlt khác 1 cách tương đương về ý tưởng.

    Quá trình nhận dạng cần trải qua các bước sau đây:
    1/Chuyển ảnh về ma trận nhị phân:
    Điều này khá dễ dàng vì ảnh bitmap đều được phân tích ra 3 màu là RGB,tư đó các màu đậm đưa vào matrix là số 1,màu trắng là số 0

    Chuyển về ma trận điểm ảnh nhị phân :

    C Code:
    1. img = new Bitmap("D:/test.png");
    2. for (int i = 0; i < img.Width; i++)
    3. {
    4.     for (int j = 0; j < img.Height; j++)
    5.     {
    6.         if (img.GetPixel(j, i).A.ToString() == "255" && img.GetPixel(j, i).B.ToString() == "255" && img.GetPixel(j, i).G.ToString() == "255" && img.GetPixel(j, i).R.ToString() == "255")
    7.         {
    8.             bitstr = bitstr + "0";
    9.         }
    10.         else
    11.         {
    12.             bitstr = bitstr + "1";
    13.         }
    14.     }
    15.     bitstr = bitstr + "\r\n";
    16. }
    bitstr chính là 1 chuỗi chứa toàn bộ các pixel của ảnh bitmap.Các bạn nên dùng các ảnh 50x50 là được.Vượt quá nên
    resize lại.Sau đó chưa vào mảng M có size là 50x50

    2/Khử nhiễu :
    Bạn dùng thuật toán loang để xác định diện tích vùng lớn nhất,sau đó lấy điểm trung tâm của vùng diện tích lớn của khu vực:

    C Code:
    1. bool b=true;
    2. while (b)
    3. {
    4.     if(A[foo, bar].ToString() == "0" || A[foo + level, bar].ToString() == "0" || A[foo - level, bar].ToString() == "0" || A[foo, bar + level].ToString() == "0" || A[foo, bar - level].ToString() == "0" || A[foo + level, bar + level].ToString() == "0" || A[foo - level, bar - level].ToString() == "0" || A[foo + level, bar - level].ToString() == "0" || A[foo - level, bar + level].ToString() == "0"){
    5.         break; // lọc các điểm là số 1 và có bao bọc
    6.     }
    7.     level++;
    8. }

    Kết quả thu được như sau:



    3/lọc và chuyển về dạng đỉnh đồ thị rời rạc :

    C Code:
    1. int l = 2;
    2. for (int foo = 1; foo <= 48; foo++)
    3. {
    4.     for (int bar = 1; bar <= 48; bar++)
    5.     {
    6.         if (M[foo, bar] == 1)
    7.         {
    8.             int k = 1;
    9.             while (k <= l)
    10.             {
    11.             M[foo + k, bar] = 0;
    12.             M[foo, bar + k] = 0;
    13.             M[foo - k, bar] = 0;
    14.             M[foo, bar - k] = 0;
    15.             M[foo + k, bar + k] = 0;
    16.             M[foo + k, bar - k] = 0;
    17.             M[foo - k, bar + k] = 0;
    18.             M[foo - k, bar - k] = 0;
    19.             k++;
    20.             }
    21.         }
    22.     }
    23. }
    kết quả thu được :


    4/Đánh dấu các đỉnh để dễ phục vụ cho các bước sau :


    5/Xây dựng các vectơ từ các node đến các node của đồ thị :

    điểm này cần chú ý như sau :

    1 đồ thị đã được phân tích ở bước 3 sẽ tạo ra các vecto có hướng đi đến các đỉnh còn lại.
    Tùy vào đường đi của các đỉnh mà ta có được cách nhận dạng.



    Dựa vào đó ta sẽ xác định giữa 2 nút với nhau tạo ra các vecto nào.


    Phân tích các đỉnh kề liên thông trực tiếp với nhau theo vecto nào.Ở đây ta lấy đỉnh kề gần nhất.
    Xác định điểm kề gần nhất:


    Qua hình ta thấy nút số 1 sẽ gần số 4 nhất.

    Vấn đề tiếp theo là xác định vecto từ đỉnh đến đỉnh là vectơ nào :


    Dựa vào đó ta sẽ viết hàm lọc tiếp các đỉnh kề có cùng vecto (nếu không làm bước này thì kết quả phân tích có khác chút nhưng vẫn có thể làm được.Tuy nhiên làm thế này để đơn giản hóa vấn đề hơn)

    VIết đầu ra tổng hợp
    Cái này viết khá khổ vì bạn cần phải tổng hợp dữ liệu liên tục và viết 1 cách kỹ lưỡng và test đầy đủ các trường hợp :

    Bạn sẽ thấy 1 điều rằng,các số 0 6 8 9 sẽ có hình thức gần như sau,các vecto 2,3,4,5 sẽ xuất hiện nhiều lần
    ,ta khoanh vùng lại để viết hàm.Nếu nằm trong 1 khoảng nào đó thì là số 8.Có thể thấy số 8 có 4 đường cong,ta
    lại duyệt từ trái sang phải,từ trên xuống dưới nên vectơ 2,3,4 xuất hiện rất cao,thứ 2 là số 6 và 9,sau là
    số 0 ...

    các vectơ 1 8 sẽ xuất hiện nhiều trong các số 1 7 ..

    từ đó ta sẽ viết hàm liên thuộc,hàm này trả về kết quả gần đúng,từ đó ta suy ra kết quả dự đoán.

    Tham khảo : Handwritten Digits Recognition của tác giả Gaurav Jain, Jason Ko
    Attached Thumbnails Attached Thumbnails anhbandau.png   cuoicung.png   danhso.png   dinh lien thong.png   knn.png  

    lammanh.png   layvecto.png   locvectogan.png   roiracdinh.png   hinh3.png  

    Đã được chỉnh sửa lần cuối bởi lttq : 03-06-2012 lúc 08:54 PM.
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  2. #2
    Ngày gia nhập
    07 2006
    Nơi ở
    Hanoi, Vietnam
    Bài viết
    2,750

    Bài viết rất tốt, ... rất hoan nghênh tinh thần của bạn!

    Có nhiều bạn không xem hình ở myopera.com được, bạn lttq đính kèm hình ảnh vào bài viết để tránh mất mát sau này!
    Email: admin[@]congdongcviet.com | CC to: info[@]congdongcviet.com
    Phone: 0972 89 7667 (Office: 04 6329 2380)
    Yahoo & Skype: dreaminess_world (Vui lòng chỉ rõ mục đích ngay khi liên hệ, cảm ơn!)

    Một người nào đó coi thường ý thức kỷ luật cũng có nghĩa là người đó đã coi thường tương lai số phận của chính bản thân người đó. Những người coi thường ý thức kỷ luật sẽ không bao giờ có được sự thành công trong sự nghiệp!

  3. #3
    Ngày gia nhập
    10 2008
    Bài viết
    258

    Hay quá, ngày xưa mình làm đến bước
    4/Đánh dấu các đỉnh để dễ phục vụ cho các bước sau. rồi mình dùng kmean để phân thành các cụm cũng nhận dạng được nhưng không chính xác lắm.

    Thank you
    Anh yêu em hí hí

  4. #4
    Ngày gia nhập
    09 2010
    Bài viết
    276

    Bài này dùng cho môn trí tuệ nhân tạo thì hay đấy nhỉ .

  5. #5
    Ngày gia nhập
    08 2011
    Bài viết
    98

    Trích dẫn Nguyên bản được gửi bởi Kevin Hoang Xem bài viết
    Bài viết rất tốt, ... rất hoan nghênh tinh thần của bạn!

    Có nhiều bạn không xem hình ở myopera.com được, bạn lttq đính kèm hình ảnh vào bài viết để tránh mất mát sau này!
    Đã edit theo lời của anh Kevin
    Nghe Metal và dịch thơ
    lttqstudy.wordpress.com

  6. #6
    Ngày gia nhập
    10 2008
    Bài viết
    54

    Mặc định Kỹ Thuật Nhận Dạng Chữ Viết Tay - Phương pháp và các thực hiện trên C#

    Cái này giống giống đường cong B-spline nhỉ

  7. #7
    Ngày gia nhập
    10 2009
    Bài viết
    4

    Trích dẫn Nguyên bản được gửi bởi thansautk Xem bài viết
    Hay quá, ngày xưa mình làm đến bước
    4/Đánh dấu các đỉnh để dễ phục vụ cho các bước sau. rồi mình dùng kmean để phân thành các cụm cũng nhận dạng được nhưng không chính xác lắm.

    Thank you
    Bạn có thể post bài của bạn lên cho mình tham khảo với được k?

  8. #8
    Ngày gia nhập
    10 2008
    Bài viết
    258
    Anh yêu em hí hí

  9. #9
    Ngày gia nhập
    04 2009
    Bài viết
    109

    Rất hay. Thanks bạn nhiều

  10. #10
    Ngày gia nhập
    02 2011
    Bài viết
    11

    bạn có source code không cho mình xin tham khảo.
    bước 4 và bước 5 mình không hiểu rõ làm sao để ra được như vậy

Các đề tài tương tự

  1. Thuật toán C++ thuật toán tra từ để viết chương trình từ điển AV trên C++?????
    Gửi bởi davilson18 trong diễn đàn Thắc mắc CTDL & Giải thuật
    Trả lời: 1
    Bài viết cuối: 17-08-2012, 05:57 AM
  2. viết thuật toán Quicksort trên dslk vòng?
    Gửi bởi tiensjvn trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 21-04-2011, 08:29 PM
  3. Bài tập C++ Viết chương trình nhập số lượng hàng hóa, giá cả, thuế, xuất ra tổng giá, thuế, tổng cộng
    Gửi bởi seit trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 04-03-2011, 09:04 AM
  4. Thuật toán nào cho nhận dạng số viết tay ?
    Gửi bởi zoro_bka trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 3
    Bài viết cuối: 22-12-2010, 09:49 PM
  5. Viết giải thuật min heap trên cây con.
    Gửi bởi Zeros trong diễn đàn Thắc mắc lập trình C/C++/C++0x
    Trả lời: 1
    Bài viết cuối: 17-04-2010, 06:56 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn