Question

Après avoir lu de nombreux messages connexes sur ce site au sujet de comparaison d'images, je pense que je vais essayer de mettre en œuvre un PCA sur chaque image afin de voir si une image est « similaire » ou non, mais je ne suis pas sûr de savoir comment obtenir les données de mes images - est-il une fonction VB que je peux utiliser pour convertir l'image en un tableau d'octets ou quelque chose afin de comparer les images? Ou une façon plus simple de comparer deux images (devrait être en noir et blanc, mais ils seront scannés, v. Petites images)

Merci beaucoup, Becky

Était-ce utile?

La solution

En outre, ici est un article utile: ce gars-là a deux images, par rapport eux, puis ont créé une troisième image qui représente graphiquement la différence entre les deux. Il semble être un beau de manière visuelle pour représenter similiarity.

Autres conseils

Pour voir si elles sont identiques ou non est assez facile en utilisant la réponse de roygbiv. Pour voir comment ils sont similaires est assez compliqué. Si ceux-ci sont des documents numérisés, ils sont vraiment ne vont jamais être identiques. Il peut être intéressant d'investir dans une option de tiers. Nous utilisons des produits dans notre processus de numérisation à partir de Accusoft et TiS .

Cela dit, il y a deux possibilités double .

Vous pouvez utiliser quelque chose:

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

Alors, voilà ce que je suis venu avec. Plutôt que de comparer les pixels individuellement, j'utilisé un algorithme de hachage alimenté à partir du contenu du fichier. Il compare ensuite les octets du hachage retourné. Dans mes tests, il est revenu deux fois plus vite que la comparaison des pixels individuels pour un bitmap de gris d'image 1152 X 720 et 101KB grand.

Voici le code:

(édition parce que la première fois que je posté le tout code semblait étrange. Commentaires supprimés).

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

Pour récupérer les données de pixel d'une image; vous pouvez utiliser Bitmap.GetPixel ou Bitmap.LockBits , qui vous donnera un BitmapData (lien a exemple de code) classe en retour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top