【问题标题】:Image Comparison in VB.NetVB.Net 中的图像比较
【发布时间】:2009-12-11 16:03:57
【问题描述】:

在阅读了本网站上有关图像比较主题的许多相关帖子后,我想我会尝试在每个图像上实施 PCA,以查看图像是否“相似”,但我不是确定如何从我的图像中获取数据 - 是否有一个 VB 函数可用于将图像转换为字节数组或其他东西以比较图像?或者比较两个图像的更简单的方法(应该是黑白的,但它们会被扫描,v. 小图像)

非常感谢, 贝基

【问题讨论】:

  • 谢谢大家的回答,我去挖掘一下。如果它有帮助的话,这个想法是一个大的符号网格,我试图跟踪网格上有多少每个符号,而用户不必单击每个符号 - 符号并不复杂,只是一个字母或简单的形状.再次感谢!

标签: wpf vb.net image-processing image-comparison


【解决方案1】:

另外,here is a useful article:这个家伙拍了两张图片,比较了它们,然后创建了第三张图片,以图形方式表示了两者之间的差异。这似乎是一种很好的描述相似性的视觉方式。

【讨论】:

  • 感谢您指出我的错误。现在,我觉得最好在第一部分留下免责声明。如果您有其他看法,请随时发表评论,我会考虑删除该部分。干杯。
  • @roygbiv - 再次感谢您的评论。我相信你确实提出了一个有效的观点,但你可能会直言不讳。干杯
  • 那篇文章看起来我可以从中做出一些我认为 - 非常好的发现:o)
【解决方案2】:

使用 roygbiv 的答案很容易查看它们是否相同。要查看它们有多相似,请访问quite complicated。如果这些是扫描的文档,它们真的永远不会完全相同。投资第三方期权可能是值得的。我们在扫描过程中使用来自AccusoftTiS 的产品。

也就是说,有几个潜在的duplicatequestions

【讨论】:

  • 其实它可能比你想象的要容易。您可以比较每个字节,看看它们的值有多大不同。比您对每个字节执行此操作,并在最终根据您读取的值计算一些百分比。
  • +1 提供实用建议!检查相等性很容易,检查它是否是“相同”的图像不是。
  • @Victor 如果将同一张图像向左或向右平移,那么通过该方法它们不太可能完全相似。但在人眼看来,它们是一回事。
【解决方案3】:

你可以使用一些东西:

Public Class MyClass
    Shared  Sub Main(ByVal args() As String)
       Byte() mydata = File.ReadAllBytes("C:\MyFile.jpg")
    End Sub
End Class

【讨论】:

    【解决方案4】:

    所以,这就是我想出的。我没有单独比较像素,而是使用了从文件内容馈送的散列算法。然后它比较返回的哈希的各个字节。在我的测试中,它返回的速度是比较 1152 X 720 和 101KB 大的灰度位图图像的单个像素的两倍。

    代码如下:

    (编辑,因为我第一次发布代码时一切看起来都很奇怪。删除了 cmets。)

    Public Shared Function CompareTwoImageHashes(ByVal pathToFirstImage As String, ByVal pathToSecondImage As String) As Boolean
    
        Dim firstImage As FileInfo = New FileInfo(pathToFirstImage)
        Dim secondImage As FileInfo = New FileInfo(pathToSecondImage)
    
        If Not firstImage.Exists Then
            Throw New ArgumentNullException("pathToFirstImage", "The file referenced by the path does not exist!")
        End If
    
        If Not secondImage.Exists Then
            Throw New ArgumentNullException("pathToSecondImage", "The file referenced by the path does not exist!")
        End If
    
        Dim hashingTool As SHA256Managed
        Dim imagesMatch As Boolean = True
    
        Try
    
            Using firstImageStream As New FileStream(firstImage.FullName, FileMode.Open)
                Using secondImageStream As New FileStream(secondImage.FullName, FileMode.Open)
    
                    hashingTool = SHA256Managed.Create()
    
                    Dim imageOneHash As Byte() = hashingTool.ComputeHash(firstImageStream)
                    Dim imageTwoHash As Byte() = hashingTool.ComputeHash(secondImageStream)
    
                    hashingTool.Clear()
    
                    If (imageOneHash.Length = imageTwoHash.Length) Then
    
                        For length As Integer = 0 To (imageOneHash.Length - 1)
    
                            If imageOneHash(length) <> imageTwoHash(length) Then
                                imagesMatch = False
    
                                Exit For
                            End If
    
                        Next
    
                        CompareTwoImageHashes = imagesMatch
                    Else
                        CompareTwoImageHashes = False
                    End If
    
                End Using
            End Using
    
        Catch ex As Exception
    
            Console.WriteLine("Error during compare: {0}", ex.Message)
    
        End Try
    
    End Function
    

    【讨论】:

      【解决方案5】:

      用于检索图像的像素数据;您可以使用Bitmap.GetPixelBitmap.LockBits,这将为您提供BitmapData (link has example code) 类作为回报。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 2015-10-27
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多