このサイトで画像比較に関する多くの関連記事を読んだ後、画像が「類似」しているかどうかを確認するために、各画像に PCA を実装しようと考えていますが、方法がわかりません。画像からデータを取得する - 画像を比較するために、画像をバイト配列などに変換するために使用できる VB 関数はありますか? または、2 つの画像を比較するより簡単な方法 (白黒である必要がありますが、スキャンされます。v. 小さい画像)
どうもありがとう、ベッキー
このサイトで画像比較に関する多くの関連記事を読んだ後、画像が「類似」しているかどうかを確認するために、各画像に PCA を実装しようと考えていますが、方法がわかりません。画像からデータを取得する - 画像を比較するために、画像をバイト配列などに変換するために使用できる VB 関数はありますか? または、2 つの画像を比較するより簡単な方法 (白黒である必要がありますが、スキャンされます。v. 小さい画像)
どうもありがとう、ベッキー
それらが同一であるかどうかを確認するには、roygbivの回答を使用すると非常に簡単です。それらがどれほど似ているかを確認するのは非常に複雑です。これらがスキャンされたドキュメントである場合、それらは実際には決して同一になることはありません。サードパーティのオプションに投資する価値があるかもしれません。スキャンプロセスでは、AccusoftとTiSの製品を使用しています。
とはいえ、重複する可能性のある 質問がいくつかあります。
また、ここに役立つ記事があります。この男は 2 つの画像を取得して比較し、2 つの画像の違いをグラフィカルに表す 3 番目の画像を作成しました。類似性を視覚的に表現するのに適しているようです。
それで、これが私が思いついたものです。ピクセルを個別に比較するのではなく、ファイルの内容から供給されるハッシュ アルゴリズムを使用しました。次に、返されたハッシュの個々のバイトを比較します。私のテストでは、グレースケールのビットマップ画像 1152 X 720 と 101KB の個々のピクセルを比較するよりも 2 倍の速さで戻ってきました。
コードは次のとおりです。
(初めてコードを投稿したときにすべてが奇妙に見えたので編集。コメントを削除しました。)
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 (リンクにはサンプル コードがあります)クラスが返されます。
あなたは何かを使うことができます:
Public Class MyClass
Shared Sub Main(ByVal args() As String)
Byte() mydata = File.ReadAllBytes("C:\MyFile.jpg")
End Sub
End Class