2010-01-22 44 views
0

我目前正處於可以將位圖轉換爲字節數組的位置。假設我有26個圖像代表a-z並有26個相應的字節數組。給定一個圖像,我想用字節數組立即查找正確的字母,而不是執行多達26個比較。有什麼方法可以散列字節數組以產生可存儲在配置文件中的散列碼?C#哈希和查找圖像

或者,如果有比散列圖像更好(更快)的方法(假設我無法訪問底層文本表示),我非常想知道它們。爲了澄清目的,假設我有「a.bmp」,「b.bmp」等。我現在在屏幕上有一個未知的圖像。我會認爲散列圖像,並且執行單個查找將是獲得正確識別的最快方式。它應該比執行多達26個單獨的比較要快。如果這個假設是不正確的,我會讚賞最佳方法的概述。

注意:這不是一個經典的OCR問題(手寫識別等),因爲每次都會呈現相同的字母。因此,字母「a」將總是產生完全相同的哈希碼

+2

我們仍然不完全理解它的「爲什麼」。基於迄今爲止我所看到的,我只會將我的圖像命名爲「a.bmp」,「b.bmp」等。如果我在內存中完成所有操作,則可能是Dictionary 。 – 2010-01-22 21:38:25

+0

現在這樣做更有意義了。散列圖像爲圖像中的像素排列產生獨特的指紋,而不是人類認爲在圖像中出現的。將一個像素從FFFFFF更改爲FFFFFE,您將得到完全不同的散列值。 – 2010-01-22 21:53:06

回答

4

您可以找到一個C#算法來散列字節數組here。然後可以使用C#散列表數據類型將散列映射到該字符。但是,您仍然需要掃描每個位圖的每個字節,因此操作是O(B * N),其中B是位圖中的字節數,N是字符數。考慮到典型位圖的大小,效率不高。

但是,如果這是OCR(光學字符識別),這個散列函數將是絕對無用的。即使一個像素不同,哈希的值也會發生很大的變化,因此來自掃描儀或數碼相機的典型光學噪聲會阻止同一字符的兩張圖片發生相同的哈希。這裏有程序化的OCR技術,但這是一個非常深刻的話題,如果這是一個OCR問題,使用預先構建的庫會更好。

+0

對於這個問題,每個C#對象都提供了一個.GetHashCode()方法。 – 2010-01-22 21:51:23

+2

確實如此,但實現哈希基於對象標識。不同存儲器地址處的兩個相同的字節數組將返回兩個不同的散列碼。我猜測這不是問題的主角所期望的行爲。 – 2010-01-22 22:03:36

1

要問的一個更好的問題是:爲什麼以這種方式處理這個問題?在什麼情況下你會收到一個字節數組,並且需要用這種方式將它與一個字符進行匹配?這不是圖像或字符識別的好方法,幾乎​​任何其他問題都會爲您提供描述圖像的元數據,它比圖像數據本身更有用且更有效。

+1

看起來像我家庭作業,或者一些快速和骯髒的OCR ... – egrunin 2010-01-22 21:39:54

+0

同意作業,雖然這將快速,骯髒和無用的OCR作爲單個像素差異使這種方法無用。 – 2010-01-22 21:52:09

1

查找一起考慮的每個圖像的唯一字節數。如果您可以找到唯一定義圖像的4個或更少的字節,則可以使用簡單的位移操作將這4個字節提取出來直接轉換爲Int32。這個整數就是你可以存儲的圖像的指紋。另外,如果你希望執行的東西慢一些,但代碼更容易,只需使用標準哈希函數(例如SHA-1)對字節數組進行哈希處理,然後使用哈希值作爲指紋。