免費論壇 繁體 | 簡體
Sclub交友聊天~加入聊天室當版主
分享
返回列表 回復 發帖

VB 影像辨識資料

以下為把影像二值化的CODE
Private Sub Command1_Click()
   

'加權平均值法
    Picture1.AutoRedraw = True
    For Y = 0 To Picture1.ScaleHeight Step 15
     For X = 0 To Picture1.ScaleWidth Step 15
     Tmp& = Picture1.Point(X, Y)
     If Len(Hex(Tmp&)) < 8 Then RS = Right(Hex(Tmp&), 2)
     If Len(Hex(Tmp&)) = 6 Then BS = Left(Hex(Tmp&), 2): GS = Mid(Hex(Tmp&), 3, 2)
     If Len(Hex(Tmp&)) = 4 Then GS = Left(Hex(Tmp&), 2)
     If Len(Hex(Tmp&)) > 1 Then R = Val("&H" + RS) Else R = 0
     If Len(Hex(Tmp&)) > 3 Then G = Val("&H" + GS) Else G = 0
     If Len(Hex(Tmp&)) > 5 Then B = Val("&H" + BS) Else B = 0
     If Len(Hex(Tmp&)) = 8 Then R = 0: G = 0: B = 0
     T = R + G + B
     If T = 0 Then T = 1
     TR = R
     TG = G
     TB = B
     R = (TR ^ 2 + TG ^ 2 + TB ^ 2) / T
     If R > 255 Then R = 255
     G = R
     B = R
     Picture1.PSet (X, Y), RGB(R, G, B)
     Next
    Next
    Picture1.AutoRedraw = False
Exit Sub



'取最大值法
    Picture1.AutoRedraw = True
    For Y = 0 To Picture1.ScaleHeight Step 15
     For X = 0 To Picture1.ScaleWidth Step 15
     Tmp& = Picture1.Point(X, Y)
     If Len(Hex(Tmp&)) < 8 Then RS = Right(Hex(Tmp&), 2)
     If Len(Hex(Tmp&)) = 6 Then BS = Left(Hex(Tmp&), 2): GS = Mid(Hex(Tmp&), 3, 2)
     If Len(Hex(Tmp&)) = 4 Then GS = Left(Hex(Tmp&), 2)
     
     If Len(Hex(Tmp&)) > 1 Then R = Val("&H" + RS) Else R = 0
     If Len(Hex(Tmp&)) > 3 Then G = Val("&H" + GS) Else G = 0
     If Len(Hex(Tmp&)) > 5 Then B = Val("&H" + BS) Else B = 0
     If Len(Hex(Tmp&)) = 8 Then R = 0: G = 0: B = 0
     PerC = (100 + Bright) / 100
     If R >= G And R >= B Then G = R: B = R
     If G >= R And G >= B Then R = G: B = G
     If B >= G And B >= R Then R = B: G = B
     Picture1.PSet (X, Y), RGB(R, G, B)
     Next
    Next
    Picture1.AutoRedraw = False
   
   
Exit Sub


***************old code*************
    For Y = 0 To Picture1.ScaleHeight Step 15
     For X = 0 To Picture1.ScaleWidth Step 15
     Tmp& = Picture1.Point(X, Y)
     If Len(Hex(Tmp&)) = 6 Then
     BS = Left(Hex(Tmp&), 2)
     GS = Mid(Hex(Tmp&), 3, 2)
     RS = Right(Hex(Tmp&), 2)
     End If
     If Len(Hex(Tmp&)) = 4 Then
     GS = Left(Hex(Tmp&), 2)
     RS = Right(Hex(Tmp&), 2)
     End If
     If Len(Hex(Tmp&)) = 2 Then
     RS = Hex(Tmp&)
     End If
     
     If Len(Hex(Tmp&)) > 1 Then
     Select Case UCase(Left(RS, 1))
     Case "F": R = 15 * 16
     Case "E": R = 14 * 16
     Case "D": R = 13 * 16
     Case "C": R = 12 * 16
     Case "B": R = 11 * 16
     Case "A": R = 10 * 16
     Case "9", "8", "7", "6", "5", "4", "3", "2", "1", "0"
     R = Val(UCase(Left(RS, 1))) * 16
     End Select
     Select Case UCase(Right(RS, 1))
     Case "F": R = R + 15
     Case "E": R = R + 14
     Case "D": R = R + 13
     Case "C": R = R + 12
     Case "B": R = R + 11
     Case "A": R = R + 10
     Case "9", "8", "7", "6", "5", "4", "3", "2", "1", "0"
     R = R + Val(Right(RS, 1))
     End Select
     Else
     R = 0
     End If


If Len(Hex(Tmp&)) > 3 Then
     Select Case UCase(Left(GS, 1))
     Case "F": G = 15 * 16
     Case "E": G = 14 * 16
     Case "D": G = 13 * 16
     Case "C": G = 12 * 16
     Case "B": G = 11 * 16
     Case "A": G = 10 * 16
     Case "9", "8", "7", "6", "5", "4", "3", "2", "1", "0"
     G = Val(UCase(Left(GS, 1))) * 16
     End Select
     Select Case UCase(Right(GS, 1))
     Case "F": G = G + 15
     Case "E": G = G + 14
     Case "D": G = G + 13
     Case "C": G = G + 12
     Case "B": G = G + 11
     Case "A": G = G + 10
     Case "9", "8", "7", "6", "5", "4", "3", "2", "1", "0"
     G = G + Val(Right(GS, 1))
     End Select
     Else
     G = 0
     End If
     
     If Len(Hex(Tmp&)) > 5 Then
     Select Case UCase(Left(BS, 1))
     Case "F": B = 15 * 16
     Case "E": B = 14 * 16
     Case "D": B = 13 * 16
     Case "C": B = 12 * 16
     Case "B": B = 11 * 16
     Case "A": B = 10 * 16
     Case "9", "8", "7", "6", "5", "4", "3", "2", "1", "0"
     B = Val(UCase(Left(BS, 1))) * 16
     End Select
     Select Case UCase(Right(BS, 1))
     Case "F": B = B + 15
     Case "E": B = B + 14
     Case "D": B = B + 13
     Case "C": B = B + 12
     Case "B": B = B + 11
     Case "A": B = B + 10
     Case "9", "8", "7", "6", "5", "4", "3", "2", "1", "0"
     B = B + Val(Right(BS, 1))
     End Select

Else
     B = 0
     End If
     If Len(Hex(Tmp&)) = 8 Then
     R = 0: G = 0: B = 0
     End If
     PerC = (100 + Bright) / 100
     If R >= G And R >= B Then
     G = R
     B = R
     End If
     If G >= R And G >= B Then
     R = G
     B = G
     End If
     If B >= G And B >= R Then
     R = B
     G = B
     End If
     Picture1.PSet (X, Y), RGB(R, G, B)
     
     Next
    Next
End Sub
如果你連VB基本的影像處理都不熟悉,以上程式提供作參考,至於車牌辨識理論
建議去找類神經網路的書籍,或者是型樣式別的理論書,會比較有幫助。

採用何種語言寫「影像處理程式」皆沒差異,
語言只是一種實現計算式及系統開發整合的工具罷了!

跟各位述說些關念,

車牌辨識 LPR(License Plate Recognition)只能算是PR圖形識別學門中的一環,
屬於OCR(Optical Character Recognition)光學文字辨識的範疇及應用,
各位有興趣或正在做論文的同學,
應試著對於 IP(Image Process)基楚影像處理學科有所理解,
進而推進到 PR(Pattern Recognition) 圖形識別學科中的
統計式、結構式、類神經網路式等
三種圖形識別原理來應用於 OCR 辨識上。

小弟曾做過 Wafer ID 晶圓印字碼檢測,台灣車牌辨識系統,
韓國車牌辨識系統,SMT AOI/IC Mark OCR文字辨識系統,
基於上述經驗值,給各位快速的收斂這科「車牌辨識」專業的學門,
建議針對圖形比對法(Pattern Match)或類神經網路法(Neural Network)
兩者來開發車牌辨識的演算核心,其辨識率皆能達到 95 %以上,
待看各位如何創作這套系統。

老實說~以大學生來做專題論文而言會有點難,
但以碩士論文而言,題目則有點老,
以博士論文而言則太簡單。




Public Class Form1
    Declare Auto Function SendMessage Lib "user32" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As IntPtr
    Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal a As String, ByVal b As Integer, ByVal c As Integer, ByVal d As Integer, ByVal e As Integer, ByVal f As Integer, ByVal g As Integer, ByVal h As Integer) As IntPtr
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim hwdc As Long
    hwdc = capCreateCaptureWindow("Dixanta Vision System", &H50000000, 0, 0, 320, 240, Me.Handle, 0)
    If (hwdc <> 0) Then
    SendMessage(hwdc, 1034, 0, 0) : SendMessage(hwdc, 1074, 1, 0) : SendMessage(hwdc, 1076, 30, 0)
    Else
    MsgBox("沒有找到Webcam")
    End If
    End Sub
End Class






參考資料


輸入影像我們知道影像有黑白、灰階、彩色,這三種色彩的影像。[4]所以對於不同的輸入影像就有不同的處理,一般而言黑白影像適用於文字辨識;灰階影像適用於分析識別;彩色影像適用於多種用途或是必須做為前處理的輸入資料。何謂前處理?就是預先處理,先將影像輸入的資料做正規化,讓這些資料轉換為可以規範的範圍內,這樣會比較好做接下來的處理動作。例如:「將彩色影像轉換為灰階影像。」如此處理的資料量就會大幅縮減,系統的效能就會明顯的提升。 影像強化,這個部分中我們要將原始的影像資料做區分,如同畫家看到人臉的時候,能夠把人臉跟風景畫面做區分,讓他的腦中只留下人臉輪廓的部分,以達到強化人臉輪廓的部分。這就是影像強化的意義。可以將文字影像的斷點或雜點,做為連接獲清除的動作,並且把相連較少的文字做區隔。這樣才能為下一個步驟提供良好的素材,以提升系統的成功機率。


紅綠藍是色彩的基礎色,而這三種顏色無法使用其他顏色混合而成,但是這三種顏色可以混和成為其他顏色。當這三種顏色依照一樣比例加到最大時,可以混和成白色。這就稱為加色系統。當我們製作網頁時,要設定文字顏色為白色,就可以輸入<font color=#FFFFFF>,其中#之後的三個顏色值,分別代表RGB,也就是紅色Red、綠色Green、藍色Blue。因此電腦螢幕最基本的顯色方式,也就是使用加色系統。當然也有減色系統,那是用於印刷的CMYK系統,由於依些考量末點在紙上點的時候,是以墨點的多少來產生不同的顏色,所謂的CMYK指的就是青色C、品紅色M、黃色Y、黑色K。其中黑色是為了補足前面三種顏色的不足而設計的。
因為RGB是屬於非線性的色彩系統,也就是說當你想要抽離出光對於色彩的影響時,是非常困難的,必須要轉換到其它的色彩系統上,才有辦法抽離出來。

二值化 二值運算處理影像形成黑白分明的圖形,一般皆令臨 界值以下界值以上的灰度值轉成白色,在許多機械視 覺的場合,在辨認與計算前,都會先對影像實施二值 運算,再來才進行後續的動作。[2] 灰階化 彩色圖轉成灰階圖時,灰階度是將紅、綠、藍三原色依照以下的比例混合而成:W = 0.30R + 0.59G + 0.11B 其中: W:灰階亮度 R:該顏色的紅色亮度 G:該顏色的綠色亮度 B:該顏色的藍色亮度 如此一來,彩色圖裡的白色還是白色,黑色還是黑色,而其它顏色則會依比例混成灰階色。[2]

滑移運算
我們可以將點素原灰度值加減一個常數,而使得整個灰度分佈圖往左或網又滑動,除了飽和(灰度值為0或最大)的點素數目有所更動,整個灰度分佈圖的曲線形狀可以說沒有太大的更動。 設G(x,y)為原始影像之點(x,y)之灰度值而G`(x,y)為運算後影像之點(x,y)之灰度值則G`(x,y)= G(x,y)±a;a為一常數,對8位元影像而言: 當G`(x,y)>255令G`(x,y)=255,當G`(x,y)<0令G`(x,y)=0,在往後的運算中也都遵循此一法來做。[2]

反轉運算: 所謂反轉運算即是將影像中亮處便暗,暗處變亮,造成了類似照片正片、負片的效果,經過反轉運算後的影像,又稱為負片影像,因為人的眼睛敏感曲線在明亮處易呈飽和狀態,亦即無法分辨量區的細部結構,此時如果我們將整個影像實施反轉運算,亮區轉換至暗區再來觀察,自然比較容易辨別一些微細的差別。對8位元影像而言,其反轉運算為G`(x,y)=255- G(x,y)[1]

馬賽克處理 是將遮罩中所有點素的灰度值加總後求其平均,然後重新寫入遮罩中的每一點素之灰度值中,這樣的操作可以想像新的畫面雖然細部的結構不可分辨。此法所使用的遮罩可視需要作調整遮罩寬度可以是奇數或偶數。並且也可以是長寬不相等的長方形,當遮罩寬度越大,則處理後畫面的點素就變的越大。以3x3之點素運算來說,對於一個點G(x,y)及其8鄰接點之灰度值會相等:
G`(x,y)=n`0=n`1=n`2=n`3=n`4=n`5=n`6=n`7
= G(x,y)+n0+n1+n2+n3+n4+n5+n6+n7/9 像3x3這種微量的之點素運算結果,能提供有點像一些沙龍藝術照布面處理的朦朧感覺。[1]
返回列表