2010-01-22 38 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)对字节数组进行哈希处理,然后使用哈希值作为指纹。