修正されたデジタル写真を除外するPerlスクリプトを作成するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1623057

  •  06-07-2019
  •  | 
  •  

質問

寝る前の昨夜、Learning PerlのScalar Dataセクションを再度閲覧し、次の文を見つけました。

  

文字列に任意の文字を含めることができるということは、生のバイナリデータを文字列として作成、スキャン、および操作できることを意味します。

すぐに思いついたのは、ハードディスクに保存した写真を実際にPerlでスキャンして、文字列Adobeが含まれているかどうかを確認できるということです。そうすることで、どれが写真加工されたかを知ることができます。そこで、私はこのアイデアを実装しようとし、次のコードを思いつきました:

#!perl
use autodie;
use strict;
use warnings;

{
    local $/="\n\n";
    my $dir = 'f:/TestPix/';
    my @pix = glob "$dir/*";

    foreach my $file (@pix) {
        open  my $pic,'<',  "$file";

        while(<$pic>) {
            if (/Adobe/) {
                print "$file\n";
            }
        }
    }
}

エキサイティングなことに、このコードは本当に機能しているようで、フォトショップで処理された写真を除外する仕事をしています。しかし、問題は多くの写真が他のユーティリティによって編集されていることです。私はそこに立ち往生していると思う。デジタル画像が編集されているかどうかを判断するための、シンプルだが普遍的な方法はありますか、

if (!= /the origianl format/) {...}

または、さらに条件を追加する必要がありますか?のような

if (/Adobe/|/ACDSee/|/some other picture editors/)

これに関するアイデアはありますか?または、プログラミングの知識がひどく限られているために単純化しすぎていますか?

いつものように、ご指導ありがとうございます。

役に立ちましたか?

解決

Perlでの最善の策は、おそらく ExifTool です。これにより、画像に埋め込まれている非画像情報にアクセスできます。ただし、他の人が言ったように、もちろんこの情報を取り除くことは可能です。

他のヒント

画像の変更を検出する方法はまったくないとは言いませんが、問題は非常に困難です。

私が知っている唯一の回答者は、 Dr. Neal Krawetz 。画像のデジタル的に変更された部分は、元の部分とは異なる圧縮エラー率を持つと主張しています。彼は、異なる品質レベルでJPEGを再保存すると、これらの違いが強調されると主張しています。

調査ではこれが事実ではないことがわかりましたが、おそらくより良い結果が得られる可能性があります。

いいえ。完全に編集された画像と、最初からそうだった画像との間には機能的な違いはありません-結局のところ、それはすべて最終的にはピクセルの袋に過ぎず、必要なすべてを削除または偽造できる他のメタデータです。

画像の編集に使用されるグラフィックプログラムの名前は、画像データ自体の一部ではなく、メタデータと呼ばれるものの一部です。これは、画像ファイルに 格納できますが、 、必須ではないため(一部のプログラムでは保存できない場合、保存しないオプションがあります)、信頼性もありません-画像を偽造した場合、メタデータも偽造した可能性があります。

あなたの質問への答えは「いいえ」です、写真が編集されたかどうかを普遍的に伝える方法はありませんが、一部の画像編集ソフトウェアは画像ファイルに署名を書き込むことがあり、不注意でそこに残されます編集者の

Perlでの画像処理について詳しく知りたい場合は、CPANが提供する優れたモジュールのいくつかをご覧ください。

  • Image :: Magick -多数の読み取り、操作、書き込み画像ファイル形式の
  • GD -多数のグラフィックプリミティブを使用してカラー図面を作成し、さまざまな形式の図面。
  • GD :: Graph -チャートの作成
  • GD :: Graph3d -GDおよびGD ::を使用して3Dグラフを作成します。グラフ

ただし、さまざまな画像形式を識別するためのユーティリティは他にもあります。これはスーパーユーザーにとっては質問ですが、さまざまなUNIXディストリビューションでは、 file を使用してさまざまな種類のファイルを識別できます。 、そしてMacOSXの場合、グラフィックコンバーターは決して私を失望させませんでした。 (獣医からディスクに乗った猫の粉砕骨盤の奇妙なマルチファイルX線を開くことさえできました。)

元のフォーマットがどのようなものであったかをどのように知りますか?画像が変更されているかどうかを確認する方法は保証されていないと確信しています。

ファイルを(私のお気に入りのプログラミング言語とファイルシステムAPIを使用して)開くだけで、そのファイルに自由に書き込みたいことができます。私がファイル形式で何かを台無しにしない限り、あなたはそれが起こったことを決して知らないだろう。

さて、画像を印刷してからスキャンして戻すことができました。オリジナルからどのように伝えますか?

他の人が述べたように、画像が修正されたかどうかを知る方法はありません。基本的に知りたいのは、現実的な写真と、強化または変更された写真の違いだと思います。

非常に複雑な画像認識アルゴリズムを実行して、画像内のすべてのピクセルを分析し、非常に複雑な処理を行って画像が修正されたかどうかを判断するオプションが常にあります。このソリューションにはおそらく、医師が作成した数百万枚の写真とそうでない写真を検査し、それらから学習するAIが含まれます。ただし、これは理論的な解決策であり、あまり実用的ではありません...おそらく映画でしか見られないでしょう。開発は非常に複雑で、おそらく数年かかります。そして、あなたがこのようなものを動作させたとしても、それはおそらく100%常に正しいとは限りません。 AIテクノロジーはまだそのレベルにないので、そうなるまでしばらく時間がかかると思います。

exiftoolのあまり知られていない機能を使用すると、JPEG量子化テーブルの分析を通じて元のソフトウェアを認識することができます(画像メタデータに依存しません)。多くのアプリケーションによって書き込まれたテーブルを認識します。一部のカメラは一部のアプリケーションと同じ量子化テーブルを使用する場合があるため、これは100%のソリューションではありませんが、検討する価値があります。 2つの画像で実行されたexiftoolの例を次に示します。最初の画像はphotoshopによって編集されました。

> exiftool -jpegdigest a.jpg b.jpg
======== a.jpg
JPEG Digest                     : Adobe Photoshop, Quality 10
======== b.jpg
JPEG Digest                     : Canon EOS 30D/40D/50D/300D, Normal
    2 image files read

これは、メタデータが削除されていても機能します。

さまざまな手法(圧縮アーチファクト、カメラのデータベースの署名プロファイルとの比較など)を使用して、実際の画像データを分析して変更の証拠を見つける既存のソフトウェアがあります。そのようなソフトウェアへのアクセスがあり、利用可能なソフトウェアがこれらの分析関数への外部アクセス用のAPIを提供している場合、そのAPIとインターフェースするPerlモジュールが存在する可能性があり、そのようなモジュールが存在しない場合は、おそらくかなり迅速に作成されます。

理論的には、画像解析コードをネイティブPerlに直接実装することも可能ですが、そうしている人は誰もいません。低レベルの何かを書いた方がいいと思います。 Perlではなく、完全にコンパイルされた言語(C / C ++など)でのプロセッサ集約型。

http://www.impulseadventure.com/photo/jpeg-snoop.html 仕事をほとんどうまくやるツールです

クローニングが行われた場合、ピクセル密度にばらつきがあります。濃度は時々手動検査で表示されます。 Photoshopのクローン領域のピクセル密度は均一になります(私の意味は、スキャン画像に対するピクセルのバリエーションです)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top