مقارنة الصورة في vb.net
-
19-09-2019 - |
سؤال
بعد قراءة العديد من الوظائف ذات الصلة على هذا الموقع حول موضوع مقارنة الصورة، أفكر سأحاول تنفيذ 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 (الرابط لديه رمز المثال) الطبقة في المقابل.