画像の「ビジュアル」のチェックサムを計算する最速の方法
-
23-09-2019 - |
質問
私は、画像のカタログのためのIDシステムを作成していますよ。私は、画像のEXIFタグを変更する場合には、変更されますので、私は()MD5を使用することはできません。
私は現在のimagemagickによって計算SHA1チェックサムを使用しています。大きな画像(21メガピクセルのJPGのためのクアッドコアXeonプロセッサ上〜15秒)に本当に遅い、それは完璧に動作しますが、それは本当にです。
速くなり一意に画像を識別する他の任意の「視覚的な」方法がありますか?
解決
あなたは代わりに、JPEGファイルの実際のビットマップデータにMD5を実行してみてください可能性があります。私は私のマシン(また、クアッドコアXeonプロセッサ)と23メガピクセルの画像上の900msについて、次の実行中にテストされます。
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)の仕事に言及が、アカウントへの画像の視覚的な情報を取ることはありません。あなたはJPEGにあなたのイメージの1つを変換する場合は、2つのファイルが同じ画像を表示しますが、全く異なるMD5 / SHA / CRCチェックサムます。
を持っています あなたの唯一の心配は、EXIF編集している場合は、、あなたは、画像の一時的なコピーを作成exiv2ライブラリと、そこからすべてのメタデータを削除して、チェックサムアルゴリズムを実行することができます。私は、これは、手動で画像を縮小するよりもはるかに高速であると仮定します。また、チェックサムのためのソースファイルのちょうど最初のn個のキロバイトを使用して計算をスピードアップすることができます。
すべての画像ファイルがカメラから直接来る場合、あなたがより良いオフになっている:あなたはexiv2でサムネイル生成済みのEXIFを抽出し(通常はわずか数キロバイト)とそのチェックサムを計算することができます。
スケールダウンのアプローチについて:また、ImageMagickのは(縮小版のバイトの構造体は、その後、変化するであろう)あなたのチェックサムが無効と思われる、将来algorithmsinそのスケーリングを変えるかもしれないという事実を認識して
は、MD5はおそらく十分な速さです。ない場合は、32ビットまたは64ビットの CRC に使用することにより、さらに高速な何かを得ることができますあなたのチェックサムのために。主な違いは、誰もが同じCRCを使用して新しいイメージを作ることができるということです。それはパロディーに非常に簡単です。誰かがMD5チェックサムを偽装することは非常に困難です。マイナーな差はCRCは、多くの、より少ないビットを持っているということですが、画像の非常に多くを持っていない限り、衝突はまだほとんどありません。
exiftool
の特許請求の範囲から二値画像を抽出することができるようにあなたは解凍せずにあなたのチェックサムを計算することができますが、私はそれを行う方法のmanページから把握することはできませんので、JPEGファイル、。
私はノートPCのIntel Core 2 DuoプロセッサL7100 CPU上のいくつかの実験をした、と8メガピクセルJPEGはPPM形式に圧縮する1秒、チェックサムを行うには、別の1秒ほどかかります。チェックサム時間はmd5sum
、sum
、およびsha1sum
を使用して、劇的な差はなかったです。あなたの最善の策は、それを解凍せずにバイナリデータを抽出する方法を見つけることであるかもしれないので。
私はまた、あなたのチェックサムが、それははるかに少ないピクセルを使用している場合でも、ほとんどの良いようになるだろうことに注意してください。これら二つを比較します。
djpeg -scale 1/8 big.jpg | /usr/bin/sha1sum # 0.70s
djpeg big.jpg | /usr/bin/sha1sum # 2.15s
視覚的にオリジナルと修正された画像はまだほとんど同じように見えても、あなたはパレット、色深度や何かを画像をトリミングまたは修正するかもしれない誰かを考慮する必要があり、その後、平らなチェックサムは、異なるものになります。 おそらく、同様の写真を検索するためのGoogle画像検索の使い方などのトリミングや再色のもの、のための効果的なアルゴリズムがあります。