Bildvergleich in VB.Net
-
19-09-2019 - |
Frage
Nach vielen verwandten Beiträgen auf dieser Website zum Thema Bildvergleich zu lesen Ich denke, ich werde versuchen, auf jedes Bild einen PCA Implementierung, um zu sehen, ob ein Bild ‚ähnlich‘ ist oder nicht, aber ich bin nicht sicher, wie die Daten aus meinen Bildern zu erhalten - ist es eine VB-Funktion, die ich verwenden kann, um das Bild in ein Array von Bytes oder etwas, um Bilder zu vergleichen, um zu konvertieren? Oder ein einfacher Weg, um zwei Bilder zu vergleichen (sollte schwarz und weiß sein, aber sie werden gescannt werden, v. Kleine Bilder)
Vielen Dank, Becky
Lösung
Auch hier ist ein nützlicher Artikel : dieser Kerl nahm zwei Bilder, verglichen sie erstellt dann ein drittes Bild, das graphisch die Differenz zwischen den beiden repräsentiert. Es scheint eine nette visuelle Art und Weise zu sein similiarity darzustellen.
Andere Tipps
Um zu sehen, ob sie sind identisch oder nicht ganz einfach ist, roygbiv Antwort verwenden. Um zu sehen, wie ähnlich sie sind, ist ziemlich kompliziert . Wenn diese Dokumente gescannt werden sie wirklich nie identisch sein werden. Es kann sich lohnen, in einem Dritten Option zu investieren. Wir verwenden Produkte in unserem Scan-Prozess von Accusoft und TiS .
Sie können etwas verwenden:
Public Class MyClass
Shared Sub Main(ByVal args() As String)
Byte() mydata = File.ReadAllBytes("C:\MyFile.jpg")
End Sub
End Class
Also, das ist, was ich kam mit. Anstatt die Pixel einzeln zu vergleichen, habe ich einen Hashing-Algorithmus aus dem Inhalt der Datei eingespeist. Es vergleicht dann die einzelnen Bytes des zurück Hash. In meinen Tests kam es doppelt so schnell zurück, um die einzelnen Pixel als Vergleich für eine Grauskala-Bitmap-Bild 1152 X 720 und 101KB groß.
Hier ist der Code:
(Bearbeitung, da das erste Mal, dass ich den Code alles geschrieben sah seltsam aus. Entfernt Kommentare.)
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
Für die Pixeldaten eines Bildes abrufen; Sie können entweder Bitmap.GetPixel oder Bitmap.LockBits , die Sie geben ein BitmapData- (Link hat Beispielcode) Klasse zurück.