4

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

非常感谢,贝基

4

5 回答 5

1

另外,这里有一篇很有用的文章:这个人拍摄了两张图像,比较了它们,然后创建了第三张图像,以图形方式表示了两者之间的差异。这似乎是描述相似性的一种很好的视觉方式。

于 2009-12-11T16:10:42.353 回答
1

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

也就是说,有几个潜在的重复 问题

于 2009-12-11T16:34:43.047 回答
0

你可以使用一些东西:

Public Class MyClass
    Shared  Sub Main(ByVal args() As String)
       Byte() mydata = File.ReadAllBytes("C:\MyFile.jpg")
    End Sub
End Class
于 2009-12-11T16:10:23.757 回答
0

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

这是代码:

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

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
于 2009-12-11T18:46:28.313 回答
0

用于检索图像的像素数据;您可以使用Bitmap.GetPixelBitmap.LockBits,这将为您提供一个BitmapData (链接有示例代码)类作为回报。

于 2009-12-13T15:43:48.303 回答