Sau khi tiến hành nhị phõn hoỏ ảnh mẫu, ta lưu ảnh lại và sau đú tiến hành tỏch cỏc ký tự đặc biệt ra khỏi văn bản và thực hiện chuẩn hoỏ chỳng. Kớch thước cỏc mẫu được chuẩn hoỏ theo kớch thước 32x16 pixels. Việc chuẩn hoỏ kớch thước mẫu được thực hiện theo kỹ thuật sau:
Giả sử sau khi tỏch mẫu cỏc ký tự cú kớch thước WxH, ta tớnh tỉ lệ phúng ảnh là : S= min(32/W , 16/H).
Tất cả cỏc cụng việc từ khõu thu nhận ảnh đến khõu chuẩn hoỏ mẫu cú thể thực hiện bằng cỏch xõy dựng một chương trỡnh phần mềm tự động thực hiện kết hợp giữa cơ khớ và điện tử. Tuy nhiờn, cụng việc này tương đối phức tạp hơn nữa nhiệm vụ chớnh của đồ ỏn này là nghiờn cứu về logic mờ cho nờn trong phạm vi của đồ ỏn này ta khụng tiến hành xõy dựng một phần mềm riờng mà sử dụng cỏc phần mềm xử lý ảnh cú sẵn kết hợp với cỏc yếu tố thủ cụng để thực hiện cỏc nhiệm vụ này. Ta chỉ tập chung vào nhiệm vụ chớnh là xõy dựng một hệ suy luận mờ nhận dạng, phõn biệt chữ viết tay mà thụi.
3.2.3 Xõy dựng thƣ viện mẫu cho cỏc ký tự
Sau khi thu được cỏc mẫu chuẩn 32x16 ta tiến hành xõy dựng một thư viện mẫu chuẩn. Thư viện mẫu này sẽ được dựng cho cụng tỏc luyện mạng và kiểm tra mạng sau này. Cụng việc xõy dựng thư viện mẫu chuẩn được xõy dựng bằng một phần mềm nhỏ. Phần mềm này làm nhiệm vụ đọc thụng tin của cỏc mẫu và ghi vào một file nào đú. File này sẽ được đọc ra khi ta dựng thư viện mẫu trong cụng tỏc huấn luyện mạng sau này.
3.2.4 Hệ suy luận học cho bài toỏn nhận dạng chữ viết tay
Để nhận dạng cỏc chữ viết, ta tiến hành xõy dựng cỏc luật mờ cho cỏc mẫu, quy tắc xỏc định luật mờ à cho mỗi ký tự:
Giả sử ta cú 3 mẫu ký tự A là cỏc mẫu ký tự cần học cỏch xõy dựng hàm à như sau: Chia ảnh ký tự thành cỏc ụ (vớ dụ 36 ụ) hàm à tại mỗi ụ sẽ được xõy dựng bằng số lần xuất hiện trờn tổng số mẫu:
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 47
Hỡnh 3.2 : Ba mẫu chữ cần đọc
Bƣớc 1: tớnh(A,à)= (a1,0), (a2,0), (a3,1), (a4,1), (a5,0), (a6,0), (a7,0), (a8,1/3), (a9,1/3) .… (a36,1/3)}
Bƣớc 2: Làm rừ theo cụng thức sau:
Ta cú thể làm rừ nhiều lần để đạt được kết quả như mong muốn.
Bƣớc 3: Căn cứ vào ký tự so sỏnh B (ký tự cần nhận dạng) ta xỏc định (B,à) giả sử ký tự so sỏnh cú hỡnh như dưới đõy:
Hỡnh 3.3 : Ký tự cần nhận dạng (B,à)={(b1,0), (b2,0), (b3,1), (b4,0), (b5,0), (b6,0), (b7,0), (b8,0), (b9,1)…(b36,1)} Bƣớc 4: Tớnh Bƣớc 5: Tớnh hệ số K B A 1 2 1 2 ' 0 0.5 1 5 . 0 B A B A B A .
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 48
Bước 6: Kết luận nếu δ < φ thỡ kết luận là đỳng và ngược lại. Thụng thường φ chọn là 0.5
Trờn đõy là cỏc bước tiến hành nhận dạng cho một đối tượng, với trường hợp nhiều đối tượng ta làm tương tự cho từng đối tượng sau đú thờm một bước là chọn ra đối tượng cú φ nhỏ nhất hay núi cỏch khỏc là thay bước 6 ở trờn bằng bước tỡm min (φ(Dti)). Đối tượng cú φ nhỏ nhấy là đối tượng giống nhất.
3.3. Xõy dựng phần mềm
Dựa vào cỏc bước tiến hành trờn, ta xõy dựng một phần mềm đơn giản bằng VisualBasic với giao diện như sau:
Hỡnh 3.4: Giao diện chƣơng trỡnh nhận dạng
Để kiểm tra hoạt động của chương trỡnh ta vẽ chữ vào khung với nột vẽ tuỳ chọn, ảnh phúng sẽ hiện ở bờn cạnh như hỡnh 4.5:
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 49
Hỡnh 3.5: Vẽ chữ cần nhận dạng.
Nếu chữ này là mẫu dữ liệu cần học thỡ ta click vào nỳt học nhận dạng (Ctrl + H), dữ liệu sẽ được lưu vào file data.txt. Cũn nếu là dữ liệu kiểm tra thỡ ta click vào nỳt nhận dạng (Crtl + R). Chương trỡnh sẽ cho ra kết quả nhận dạng như hỡnh 4.6 dưới đõy:
Hỡnh 3.6: Kết quả nhận dạng sau khi vẽ chữ.
Ta cú thể xem trong dữ liệu cỏc mẫu đó học (hoặc xoỏ cỏc mẫu đó học) bằng cỏch chọn mẫu chữ rồi bấm vào xem mẫu trong dữ liệu (hoặc xoỏ mẫu). Chương
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 50
trỡnh cũng cho phộp nạp dữ liệu từ file ảnh ngoài bằng cỏch bấm vào Open (hoặc Ctrl + O):
Rồi chọn file ảnh như hỡnh 3.7:
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 51
`
Hỡnh 3.8: Giao diện sau khi mở file ảnh ký tự.
Ta tiến hành nhận dạng, chương trỡnh cho ra kết quả như hỡnh 4.9:
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 52
Chương trỡnh cũng cho phộp ghi dữ liệu ra file ảnh:
Hỡnh 3.10: Ghi ký tự ra file ảnh
Trong chương trỡnh trờn đó dựng một số thủ tục: Thủ tục để hiện cỏc điểm ảnh của ký tự:
-Private Function celldrawed(ByVal p As PictureBox, ByVal i As Long, ByVal j As Long) As Boolean
-Sub DrawGrid(ByVal p As PictureBox)
-Sub trimPic(ByVal p As PictureBox, ByVal Border As Byte) Thủ tục vẽ cỏc ký tự:
-Private Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Thủ tục để lưu trữ dữ liệu: -Private Sub CmdHoc_Click()
File lưu trữ dữ liệu ở dạng File cú cấu trỳc như sau : Type Record = Kytuas string *1
TanSuat (0 To R_grid - 1, 0 To H_grid - 1) As Long Tong as long
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 53
KẾT LUẬN
Nội dung chớnh của luận văn là đề cập đến lý thuyết về logic mờ, lý thuyết nhận dạng và đặc biệt là nghiờn cứu mụ hỡnh của bài toỏn nhận dạnh chữ viết tay, một bài toỏn đang được cỏc nhà nghiờn cứu quan tõm. Cỏc kết quả chớnh của luận văn gồm cú:
1. Nghiờn cứu cỏc kiến thức cơ bản về logic mờ và nhận dạng mờ. Đõy là kiến thức quan trọng để nghiờn cứu về bài toỏn nhận dạng chữ viết tay.
2. Tỡm hiểu một số kỹ thuật quan trọng trong lý thuyết nhận dạng ảnh, đõy là những kỹ thuật cần thiết cho quỏ trỡnh nhận dạng núi chung và nhận dạng chữ viết tay núi riờng.
3. Tỡm hiểu, phõn tớch bài toỏn nhận dạng chữ viết tay, một bài toỏn quan trọng trong lý thuyết nhận dạng.
4. Xõy dựng quy trỡnh chi tiết trong quỏ trỡnh giải quyết bài toỏn nhận dạng chữ viết tay.
5. Xõy dựng phần mềm nhận dạng chữ viết tay trờn nền Visual Basic cho phộp nhận dạng với độ chớnh xỏc cao, thuận tiện cho người dựng.
Hướng phỏt triển tiếp theo của luận văn là tiếp tục bổ sung thư viện chương trỡnh mẫu, nõng cao độ chớnh xỏc trong kết quả nhận dạng và thay đổi giao diện của phần mềm tiện lợi cho người dựng hơn. Phỏt triển kết quả nghiờn cứu để xõy dựng cỏc phần mềm chữ viết cho cỏc ngụn ngữ của cỏc dõn tộc Việt Nam.
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 54
TÀI LIỆU THAM KHẢO
1. TIẾNG VIỆT
[1] Lương Manh Bỏ, Nguyễn Thanh Thuỷ , 1999, Nhập mụn xử lý ảnh số - NXB Khoa học và Kỹ thuật
[2] Bựi Cụng Cường, Nguyễn Doón Phước, 2001, Hệ mờ mạng nơron & ứng dụng - NXB Khoa học và Kỹ thuật.
[3] Phạn Xuõn Minh, Nguyễn Doón Phước, 1997, Lý thuyết điều khiển mờ - NXB Khoa học và Kỹ thuật.
[4] Nguyễn Hoàng Phương, Bựi Cụng Cường, Phạn Xuõn Minh, Nguyễn Doón Phước, Chu Văn Hỷ, 1998, Hệ mờ và ứng dụng - NXB Khoa học và Kỹ thuật. 2. TIẾNG ANH
[5] Christopher Edwards and Sarah K. Spurgeon, Taylor and Fransis, Sliding Moded Control Theory and App;ication, 1998.
[6] Hung T. Nguyen, Michio Sugano, Fuzzy Systens, modeling and Control, Kluwer academic publishers, 1998.
[7] L.X. Wang, A Couse in Fuzzy Sytem and Control, Prentice –Hall International, 1997. [8] Tom M. mitchell, Machine liarning, 1997.
[9] Tinku Acharya, Ajoy K.Ray, Image Processing Principles and App;ication, Jonh Wiley & Son, Honoken, 2005.
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 55
(Mó chương trỡnh “Nhận dạng ký tự”) Module1(code):
Option Explicit
Public Const COLORBGR = vbWhite Public Const R_grid = 16
Public Const H_grid = 32
Public Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long
Public Declare Function SetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal crColor As Long) As Long
Public Type Record Kytu As String * 1
Tansuat(0 To R_grid - 1, 0 To H_grid - 1) As Long Tong As Long
End Type
ublic Type ToaDo X As Integer Y As Integer End Type
Public FnameData As String Public fmain As FrmMain
Sub main()
Set fmain = New FrmMain If Right(App.Path, 1) = "\" Then
FnameData = App.Path & "Data.txt"
App.HelpFile = App.Path & "NhanDangKyTu.chm" Else
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 56
App.HelpFile = App.Path & "\NhanDangKyTu.chm" End If fmain.Show End Sub --- FrmMain(code): Option Explicit
Dim Drawing As Boolean Dim ColorDraw As Long
Dim MyRecord As Record, RecordNumber Dim NewKT As Record
Dim oKytu As String
Sub DrawGrid(ByVal p As PictureBox) On Error GoTo err_
Dim i As Integer
Dim Cao, Rong As Integer
Dim BuocDoc, BuocNgang As Single BuocDoc = p.Width / R_grid BuocNgang = p.Height / H_grid Cao = p.Height
Rong = p.Width p.DrawWidth = 1 For i = 0 To H_grid
p.Line (0, CInt(i * BuocNgang))-(Rong, CInt(i * BuocNgang)), vb3DFace Next
For i = 1 To R_grid
p.Line (CInt(i * BuocDoc), 0)-(CInt(i * BuocDoc), Cao), vb3DFace Next
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 57 Exit Sub err_: MsgBox Err.Description, 0 End Sub
Private Sub CmdExit_Click() Unload Me
End End Sub
Private Sub CmdHoc_Click() ' hoc nhan dang Dim i, j As Integer
Dim KtuInFile As Boolean Dim s As String
Dim maxsize
On Error GoTo err_
If Len(Text1.Text) <= 0 Then
MsgBox "chua nhap ky tu can hoc la gi ?", 0, "Thong bao" Exit Sub
End If
If Len(Text1.Text) > 1 Then
MsgBox "chi duoc phep nhap 1 ky tu can hoc", 0, "Thong bao" Exit Sub
End If
KtuInFile = False trimPic Picture1, 1
Open FnameData For Random As #1 Len = Len(MyRecord) maxsize = LOF(1) \ Len(MyRecord)
For RecordNumber = maxsize To 1 Step -1 Seek #1, RecordNumber
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 58
Get #1, , MyRecord s = MyRecord.Kytu
If s = Text1.Text Then 'Neu Ky tu da co trong file thi cap nhat KtuInFile = True
For i = 0 To R_grid - 1 For j = 0 To H_grid - 1
MyRecord.Tansuat(i, j) = MyRecord.Tansuat(i, j) + NewKT.Tansuat(i, j)
Next Next
MyRecord.Tong = MyRecord.Tong + 1 Put #1, RecordNumber, MyRecord End If
Unlock #1, RecordNumber If KtuInFile Then Exit For Next RecordNumber
If Not KtuInFile Then 'Neu Ktu chua co trong file thi Append vao File Seek #1, maxsize + 1 s = Text1.Text MyRecord.Kytu = s For i = 0 To R_grid - 1 For j = 0 To H_grid - 1 MyRecord.Tansuat(i, j) = NewKT.Tansuat(i, j) Next Next MyRecord.Tong = 1
Put #1, maxsize + 1, MyRecord List1.AddItem Space(5) & s
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 59 End If Close #1 Exit Sub err_: MsgBox Err.Description, 0 End Sub
Private Function celldrawed(ByVal p As PictureBox, ByVal i As Long, ByVal j As Long) As Boolean
Dim X, Y, X1, Y1, X2, Y2, DrawPixel As Integer Dim BuocDoc, BuocNgang As Single
On Error Resume Next
BuocDoc = p.Width / R_grid BuocNgang = p.Height / H_grid DrawPixel = 0 X1 = CInt(i * BuocDoc) X2 = CInt((i + 1) * BuocDoc) Y1 = CInt(j * BuocNgang) Y2 = CInt((j + 1) * BuocNgang) For X = X1 To X2 For Y = Y1 To Y2
If GetPixel(p.hdc, X, Y) = ColorDraw Then DrawPixel = DrawPixel + 1 End If Next Next If DrawPixel > 1 Then celldrawed = True Else celldrawed = False
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 60
End If End Function
Private Sub CmdNhanDang_Click() Dim i As Integer
Dim s As String
Dim maxsize As Integer On Error GoTo err_
Check1.Tag = Check1.Value Check1.Value = 0
trimPic Picture1, 1
Check1.Value = Check1.Tag Me.Text1.Text = ""
Open FnameData For Random As #1 Len = Len(MyRecord) maxsize = LOF(1) \ Len(MyRecord)
Dim min As Single min = 100
s = ""
For RecordNumber = maxsize To 1 Step -1 Seek #1, RecordNumber
Get #1, , MyRecord If Beta < min Then min = Beta s = MyRecord.Kytu End If Next RecordNmber Close #1 If Len(s) > 0 Then Me.Label10.Caption = s
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 61
Else
MsgBox "khong tim duoc ky tu nao trong file du lieu, hay dinh nghia tu nay", vbCritical, "Thong bao"
Exit Sub ' End If Set_status 4 Exit Sub err_: MsgBox Err.Description, 0 End Sub
Private Sub CmdRemoveData_Click() ' xoa mau du lieu Dim i, t, maxsize As Integer
Dim Ftmp As String Dim dem As Long dem = 0
If MsgBox("Ban muon xoa cac ky tu duoc danh dau ? ", vbYesNo, "Xac nhan") = vbYes Then
If Right(App.Path, 1) = "\" Then Ftmp = App.Path & "data.tmp" Else
Ftmp = App.Path & "\data.tmp" End If
i = List1.ListCount - 1
Open FnameData For Random As #1 Len = Len(MyRecord) Do While (i >= 0)
If List1.Selected(i) = True Then RecordNumber = List1.ItemData(i) Seek #1, RecordNumber
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 62
Get #1, , MyRecord MyRecord.Kytu = ""
Put #1, RecordNumber, MyRecord Unlock #1, RecordNumber dem = dem + 1 End If i = i - 1 Loop Close #1 Me.List1.Clear
Open Ftmp For Random As #1 Len = Len(MyRecord) Open FnameData For Random As #2 Len = Len(MyRecord) i = 1
maxsize = LOF(2) \ Len(MyRecord) For RecordNumber = 1 To maxsize Step 1 Seek #2, RecordNumber Get #2, , MyRecord If Len(Trim(MyRecord.Kytu)) > 0 Then Put #1, i, MyRecord i = i + 1 End If Next RecordNumber Close #2 Close #1 Kill FnameData FileCopy Ftmp, FnameData Kill Ftmp LoadKThoc End If
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 63
End Sub
Private Sub ve(ByVal p As PictureBox, ByVal i As Integer, ByVal j As Integer) Dim X, Y As Long
Dim Le As Integer
Dim BuocDoc, BuocNgang As Single On Error GoTo err1
Le = 2
BuocDoc = (p.Width - Le) / R_grid BuocNgang = (p.Height - Le) / H_grid
p.Line (CInt(i * BuocDoc), CInt(j * BuocNgang))-(CInt((i + 1) * BuocDoc), CInt((j + 1) * BuocNgang)), vbRed, B
p.Refresh Exit Sub err1:
MsgBox Err.Description, 0 End Sub
Function Beta() As Single Dim i, j As Integer
Dim tam As Single
Dim tmp, Tong, M_a As Single Dim Totalcell As Long
On Error GoTo err_
Totalcell = (R_grid) * (H_grid) Tong = 0
For i = 0 To R_grid - 1 For j = 0 To H_grid - 1
tam = MyRecord.Tansuat(i, j) / MyRecord.Tong If tam >= 0 And tam <= 0.5 Then
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 64 Else tam = 1 - 2 * (1 - tam) ^ 2 End If M_a = tam tmp = M_aDeltab(M_a, NewKT.Tansuat(i, j)) Tong = Tong + tmp Next Next
Beta = Tong / Totalcell Exit Function
err_:
MsgBox Err.Description, 0 End Function
Function M_ahopb(ByVal A As Single, ByVal B As Single) As Single If A > B Then M_ahopb = A Else M_ahopb = B End If End Function
Function M_aGiaob(ByVal A As Single, ByVal B As Single) As Single If A > B Then M_aGiaob = B Else M_aGiaob = A End If End Function
Function M_aDeltab(ByVal Ma As Single, ByVal Mb As Single) As Single M_aDeltab = M_ahopb(M_aGiaob((1 - Ma), Mb), M_aGiaob((1 - Mb), Ma))
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 65
End Function
Private Sub CmdViewMau_Click() Dim i, j As Integer
Dim s, Kytu As String Dim maxsize
On Error GoTo err_
Kytu = Trim(List1.List(List1.ListIndex)) If Len(Ktu) <= 0 Then
MsgBox "Chua chon ky tu, can xem danh muc cac ky tu da hoc", 0 Exit Sub End If Me.Picture2.Cls DrawGrid Picture2 Set_status 2 For i = 0 To R_grid - 1 For j = 0 To H_grid - 1 NewKT.Tansuat(i, j) = 0 Next Next
Open FnameData For Random As #1 Len = Len(MyRecord) maxsize = LOF(1) \ Len(MyRecord)
For RecordNumber = maxsize To 1 Step -1 Seek #1, RecordNumber
Get #1, , MyRecord s = MyRecord.Kytu If s = Kytu Then
LblTong.BackStyle = 0
LblTong.Caption = MyRecord.Tong & " Mẫu" LblTong.Visible = True
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 66
LblTong.Refresh
For i = 0 To R_grid - 1 For j = 0 To H_grid - 1
If (MyRecord.Tansuat(i, j) / MyRecord.Tong) >= 0.4 Then ve Picture2, i, j End If Next Next Exit For End If Next RecordNumber Close #1 Exit Sub err_: MsgBox Err.Description, 0 End Sub
Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) Select Case KeyCode
Case vbKeyF12 MsgBox oKytu End Select
End Sub
Private Sub Form_Load() Dim Buoc, i As Integer On Error Resume Next ColorDraw = vbBlack
Buoc = Me.Picture1.Width \ R_grid Me.Picture1.Width = Buoc * R_grid Me.Picture1.Height = Buoc * H_grid
Soỏ hoựa bụỷi Trung taõm Hoùc lieọu http://lrc.tnu.edu.vn/ 67 Me.Picture2.Width = Me.Picture1.Width Me.Picture2.Height = Me.Picture1.Height Me.Picture2.Top = Me.Picture1.Top DrawGrid Picture2 Me.Label10.Caption = "" Set_status 1 If Len(Dir(FnameData)) <= 0 Then
If MsgBox("Khong tim thay File du lieu, Bam Yes chon File du lieu can lam viec. Bam No tao file du lieu moi?", vbYesNo, "Thong bao") = vbYes Then Me.CommonDialog1.Filter = "*.dat|*.dat|*.*|*.*"
Me.CommonDialog1.FilterIndex = 0 i = 1
FnameData = ""
Do While (i <= 3) And Len(FnameData) <= 0 Me.CommonDialog1.ShowOpen If Len(Me.CommonDialog1.FileName) > 0 Then