سؤال

بعد قراءة العديد من الوظائف ذات الصلة على هذا الموقع حول موضوع مقارنة الصورة، أفكر سأحاول تنفيذ PCA على كل صورة لمعرفة ما إذا كانت الصورة "تشبه" أم لا، لكنني لست متأكدا من كيفية احصل على البيانات من صورتي - هل هناك وظيفة VB التي يمكنني استخدامها لتحويل الصورة إلى صفيف من البايتات أو أي شيء من أجل مقارنة الصور؟ أو طريقة أبسط لمقارنة صورتين (يجب أن تكون بالأبيض والأسود ولكن سيتم مسحها ضوئيا، v. الصور الصغيرة)

شكرا جزيلا، بيكي

هل كانت مفيدة؟

المحلول

ايضا، هنا مقال مفيد: استغرق هذا الرجل صورتين، مقارنة بها، ثم أنشأت صورة ثالثة تمثلت بيانيا الفرق بين الاثنين. يبدو أنه لطيف الطريقة البصرية لتصوير التشكيلي.

نصائح أخرى

لمعرفة ما إذا كانت متطابقة أم لا سهلة الاستخدام تماما إجابة Roygbiv. لمعرفة كم هو مماثلة هي معقد إلى حد ما. وبعد إذا كانت هذه مستندات ممسوحة ضوئيا، فهي في الواقع لن تكون متطابقة. قد يكون من المفيد الاستثمار في خيار طرف ثالث. نحن نستخدم المنتجات في عملية المسح لدينا من Accusoft. و هذا.

ومع ذلك، هناك اثنين من الإمكانات مكرر أسئلة.

يمكنك استخدام شيء ما:

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

لذلك، هذا ما توصلت إليه. بدلا من مقارنة البكسل على حدة، استخدمت خوارزمية التجزئة تتغذى من محتويات الملف. ثم يقارن بايت الفرد من التجزئة عاد. في اختباراتي، عاد مرتين بأسرع ما يقارن بكسلات الفردية لصورة نقطية على النحو الرمادي 1152 × 720 و 101kb كبيرة.

إليك الرمز:

(التحرير لأن المرة الأولى التي قمت بنشرها على رمز كل شيء بدا غريبا. تمت إزالة التعليقات.)

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