Domanda

Dopo aver letto molti post correlati su questo sito sul tema del confronto delle immagini che sto pensando cercherò l'attuazione di un PCA su ogni immagine per vedere se l'immagine è 'simile' o no, ma non sono sicuro di come ottenere i dati dal mio immagini - c'è una funzione di VB che posso usare per convertire l'immagine in un array di byte o qualcosa del genere, al fine di confrontare le immagini? O un modo più semplice per confrontare due immagini (dovrebbe essere in bianco e nero ma continuerà a sottoporre a scansione, v. Immagini di piccole dimensioni)

Grazie mille, Becky

È stato utile?

Soluzione

Inoltre, ecco un articolo utile : questo ragazzo ha preso due immagini, a confronto poi creato una terza immagine che rappresenta graficamente la differenza tra i due. Sembra essere un bel modo visivo per rappresentare similiarity.

Altri suggerimenti

Per vedere se sono identici o non è abbastanza facile usando la risposta di ROYGBIV. Per vedere quanto sono simili è piuttosto complicato . Se questi vengono analizzati i documenti che stanno davvero andando mai essere identiche. Può essere utile investire in una terza opzione parti. Usiamo prodotti nel nostro processo di scansione da Accusoft e TiS .

Detto questo, ci sono un paio di potenziale duplicato .

È possibile utilizzare qualcosa:

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

Quindi, questo è quello che mi è venuta. Invece di confrontare singolarmente i pixel, ho usato un algoritmo di hashing alimentato dai contenuti del file. Confronta, poi, i singoli byte del hash restituito. Nel mio test, è tornato due volte più veloce confronto tra i singoli pixel per un'immagine bitmap a scala di grigi 1152 x 720 e 101KB grande.

Ecco il codice:

(modifica perché la prima volta che ho postato il codice tutto sembrava strano. Commenti rimossi.)

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

Per recuperare i dati di pixel di un'immagine; è possibile utilizzare Bitmap.GetPixel o Bitmap.LockBits , che vi darà un BitmapData (link ha il codice di esempio) classe in cambio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top