Pregunta

Después de leer muchos mensajes relacionados en este sitio sobre el tema de la comparación de imágenes que estoy pensando Voy a tratar de implementar un PCA en cada imagen con el fin de ver si una imagen es 'similar' o no, pero no estoy seguro de cómo obtener los datos de mis imágenes - ¿existe una función de VB que puedo utilizar para convertir la imagen en una matriz de bytes o algo con el fin de comparar las imágenes? O una manera más sencilla de comparar dos imágenes (debería ser en blanco y negro pero van a ser escaneado, v. Pequeñas imágenes)

Muchas gracias, Becky

¿Fue útil?

Solución

Además, aquí es un artículo útil : este chico tomó dos imágenes, en comparación ellos, a continuación, crear una tercera imagen que representa gráficamente la diferencia entre los dos. Parece ser un buen manera visual para representar similiarity.

Otros consejos

Para ver si son iguales o no es del todo fácil usando la respuesta de roygbiv. Para ver lo similares que son es bastante complicado . Si se trata de documentos escaneados que están realmente nunca van a ser idénticos. Puede valer la pena invertir en una opción de terceros. Utilizamos productos en nuestro proceso de escaneo desde Accusoft y TiS .

Dicho esto, hay un par de potencial duplicado .

Puede usar algo:

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

Por lo tanto, esto es lo que ocurrió. En lugar de comparar los píxeles de forma individual, he utilizado un algoritmo de hash alimentado desde el contenido del archivo. A continuación se comparan los bytes individuales del hash devuelto. En mis pruebas, que regresó dos veces más rápido que la comparación de los píxeles individuales de una imagen de mapa de bits de escala de grises de 1152 x 720 y 101KB grande.

Aquí está el código:

(edición porque la primera vez que he publicado el código todo parecía extraño. Comentario sea eliminado.)

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

Para recuperar los datos de píxeles de una imagen; usted puede usar Bitmap.GetPixel o Bitmap.LockBits , que le dará un BitmapData (enlace tiene código de ejemplo) clase a cambio.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top