Pergunta

Depois de ler muitos posts relacionados neste site sobre o assunto de comparação de imagem Eu estou pensando que eu vou tentar implementar uma PCA em cada imagem, a fim de ver se uma imagem é 'similar' ou não, mas eu não sou certeza de como obter os dados de minhas imagens - há uma função VB que eu possa usar para converter a imagem em um array de bytes ou algo, a fim de comparar imagens? Ou uma maneira mais simples para comparar duas imagens (deve ser preto e branco, mas eles vão ser digitalizados, v. Pequenas imagens)

Muito obrigado, Becky

Foi útil?

Solução

Além disso, aqui está um artigo útil : esse cara tomou duas imagens, em comparação -los, em seguida, criou uma terceira imagem que representada graficamente a diferença entre os dois. Parece ser uma boa maneira visual de similaridade retratam.

Outras dicas

Para ver se eles são idênticos ou não é muito fácil usando a resposta de roygbiv. Para ver como eles são semelhantes é bastante complicado . Se estes são documentos digitalizados eles estão realmente nunca vai ser idênticos. Pode valer a pena investir em uma terceira opção festa. Usamos produtos em nosso processo de digitalização a partir Accusoft e Tis .

Dito isto, há um par de potencial duplicado .

Você pode usar algo:

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

Então, isso é o que eu vim acima com. Em vez de comparar os pixels individualmente, eu usei um algoritmo de hash alimentado a partir do conteúdo do arquivo. Em seguida, ele compara bytes individuais do hash retornado. Em meus testes, ele voltou duas vezes mais rápido como comparar os pixels individuais para uma imagem bitmap em escala de cinza 1152 X 720 e 101KB grande.

Aqui está o código:

(edição porque a primeira vez que eu postei o código tudo parecia estranho. Comentários removidos.)

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 os dados de pixel de uma imagem; você pode usar Bitmap.GetPixel ou Bitmap.LockBits , que lhe dará uma BitmapData (link tem exemplo de código) classe em troca.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top