Вопрос

Прочитав множество связанных сообщений на этом сайте на тему сравнения изображений, я думаю, что попробую реализовать PCA для каждого изображения, чтобы увидеть, является ли изображение «похожим» или нет, но я не уверен, как это сделать. получить данные из моих изображений - есть ли функция VB, которую я могу использовать для преобразования изображения в массив байтов или что-то в этом роде для сравнения изображений?Или более простой способ сравнить два изображения (должны быть черно-белыми, но они будут отсканированы, т.маленькие изображения)

Большое спасибо, Бекки

Это было полезно?

Решение

Также, вот полезная статья:этот парень взял два изображения, сравнил их, а затем создал третье изображение, которое графически представляло разницу между ними.Кажется, это приятно визуальный способ изобразить сходство.

Другие советы

Проверить, идентичны они или нет, довольно легко, используя ответ Ройгбива.Чтобы увидеть, насколько они похожи, довольно сложный.Если это отсканированные документы, они никогда не будут идентичными.Возможно, стоит инвестировать в вариант третьей стороны.В процессе сканирования мы используем продукты от Аккусофт и ТиС.

Тем не менее, есть несколько потенциальных дубликат вопросы.

Вы можете использовать что-то:

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

Итак, вот что я придумал.Вместо того, чтобы сравнивать пиксели по отдельности, я использовал алгоритм хеширования, основанный на содержимом файла.Затем он сравнивает отдельные байты возвращенного хеша.В моих тестах результаты были в два раза быстрее, чем при сравнении отдельных пикселей для растрового изображения в оттенках серого размером 1152 X 720 и размером 101 КБ.

Вот код:

(редактирую, потому что когда я впервые опубликовал код, все выглядело странно.удалил комментарии.)

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

Для получения данных пикселей изображения;вы можете использовать Bitmap.GetPixel или Bitmap.LockBits, что даст вам BitmapData (ссылка содержит пример кода) класс взамен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top