画像をカタログ化するためのIDシステムを作成したいと思っています。画像のEXIFタグを変更すると変更されるため、md5()を使用できません。
現在、imagemagickによって計算されたSHA1チェックサムを使用しています。完全に機能しますが、大きな画像では非常に遅くなります(21メガピクセルのJPGのクアッドコアxeonでは約15秒)。
より高速な画像を一意に識別する他の「視覚的」方法はありますか?
画像をカタログ化するためのIDシステムを作成したいと思っています。画像のEXIFタグを変更すると変更されるため、md5()を使用できません。
現在、imagemagickによって計算されたSHA1チェックサムを使用しています。完全に機能しますが、大きな画像では非常に遅くなります(21メガピクセルのJPGのクアッドコアxeonでは約15秒)。
より高速な画像を一意に識別する他の「視覚的」方法はありますか?
JPEGファイルの代わりに実際のビットマップデータでMD5を実行してみることができます。私は自分のマシン(これもクアッドコアXeon)でテストしましたが、23メガピクセルの画像で約900ミリ秒で次のように実行されます。
uint32_t width = MagickGetImageWidth(imageWand);
uint32_t height = MagickGetImageHeight(imageWand);
uint8_t *imageData = malloc(width * height * 3);
MagickExportImagePixels(imageWand,
0, 0, width, height, "RGB", CharPixel, imageData);
unsigned char *imageDigest = MD5(imageData, width * height * 3, NULL);
free(imageData);
「ビジュアルチェックサム」とはどういう意味ですか?言及したアルゴリズム(md5 / sha / crc)はバイトベースで機能しますが、画像の視覚情報は考慮されていません。画像の1つをJPEGに変換すると、2つのファイルには同じ画像が表示されますが、md5 / sha/crcチェックサムがまったく異なります。
exifの編集だけが心配な場合は、画像の一時的なコピーを作成し、exiv2ライブラリを使用して画像からすべてのメタデータを取り除き、チェックサムアルゴリズムを実行できます。これは、画像を手動で縮小するよりもはるかに高速だと思います。チェックサムにソースファイルの最初のnキロバイトだけを使用することで、計算を高速化することもできます。
すべての画像ファイルがカメラから直接取得される場合は、さらに良い方法です。事前に生成されたexifサムネイルをexiv2(通常はわずか数キロバイト)で抽出し、そのチェックサムを計算できます。
スケールダウンアプローチについて:ImageMagickが将来スケーリングアルゴリズムを変更し、チェックサムが無効になる可能性があることにも注意してください(スケールダウンバージョンのバイト構造は変更されます)。
Todd Yandellが指摘したように、MD5はおそらく十分に高速です。そうでない場合は、チェックサムに32ビットまたは64ビットのCRCを使用することで、さらに高速に処理を行うことができます。主な違いは、誰でも同じCRCで新しいイメージを作成できることです。なりすましは非常に簡単です。誰かがMD5チェックサムをスプーフィングするのは非常に困難です。小さな違いは、CRCのビット数がはるかに少ないことですが、画像の数が非常に多い場合を除いて、衝突が発生する可能性はほとんどありません。
exiftool
JPEGファイルからバイナリイメージを抽出できると主張しているので、解凍せずにチェックサムを計算できますが、manページからその方法を理解できません。
ラップトップのIntelCore2 Duo L7100 CPUでいくつかの実験を行いましたが、8MP JPEGはPPM形式に圧縮するのに約1秒かかり、次にチェックサムを行うのにさらに1秒かかります。md5sum
チェックサム時間は、、、sum
およびを使用しても劇的な違いはありませんでしたsha1sum
。したがって、最善の策は、バイナリデータを解凍せずに抽出する方法を見つけることかもしれません。
また、使用するピクセルがはるかに少ない場合でも、チェックサムはほぼ同じようになります。これら2つを比較してください。
djpeg -scale 1/8 big.jpg | /usr/bin/sha1sum # 0.70s
djpeg big.jpg | /usr/bin/sha1sum # 2.15s
誰かが画像をトリミングしたり、パレットや色深度などを変更したりする可能性があることを考慮する必要があります。そうすると、元の画像と変更された画像が視覚的にほとんど同じように見えても、フラットチェックサムは異なります。おそらく、Google画像検索が類似の写真の検索に使用するように、トリミングまたは色変更されたものに効果的なアルゴリズムがあります。