拡大された写真をどのように検出できますか?


8

私はJPEG写真のコレクションを持っています。それぞれの長辺が500〜600ピクセルです。かなり小さい写真からアルゴリズムによって拡大された写真をどのように検出できますか?

オンラインマーケットプレイスでは、各販売者が販売する製品の写真をアップロードする必要があります。これらの写真は、幅が500ピクセル以上または高さが500ピクセル以上である必要があります。標準の白い背景をより多くの白で拡張するなど、無地の境界線を追加することで、売り手がこの要件を回避しようとしているのかどうかはすでにわかります。しかし最近、売り手は500ピクセルの要件が公開される前に撮った古い写真をアップスケーリングすることでこれを回避するようになりました。写真が最近隣内挿、双一次内挿、または双三次内挿で拡大されているかどうかを判断する良い方法は何ですか?


明確にするために、人間の眼球による評価なしに、完全に自動化された検出について質問していますか?
junkyardsparkle 2015

4
自動テストの場合、stackoverflowが答えを出す可能性が高くなります
Renan Le Caro

@Renan GIMPフィルターのシーケンスを使用した手動テストでさえ、特定の売り手の画像のスポットチェックに機能する可能性があります。
Damian Yerrick 2015

1
私たちが尋ねる必要がある質問は、なぜあなたは気にするのですか?それは答えにかなりの違いを
もたらし

@JamesSnell悪い写真はバイヤーを撃退します。たとえばeBayのガイダンスをご覧ください。
Damian Yerrick、2015

回答:


9

DOGが写真のぼやけを嗅ぐ。

デジタルで拡大された写真にペナルティを課す場合は、焦点が合っていない写真にもペナルティを課す必要があります。ぼやけたエッジと詳細の両方が原因で、元の小さなフォーカスが原因であるかフォーカスが不十分であるかに関係なく、視聴者に同じ不快感を与えます。あなたがしたいことは、高い空間周波数の欠如であるぼけを検出することです。

画像とそれ自身のぼやけたコピーの違いを試してください。画像が既にぼやけている場合、1ピクセルのガウスぼかしは、画像が鮮明である場合ほど画像を変更しません。したがって、鮮明な画像とぼやけたバージョンの違いは、ぼやけた画像とさらにぼやけたバージョンの違いよりも大きくなります。コンピュータービジョンでは、この手法は " ガウスの差 "(DOG)と呼ばれます。

  1. GIMPまたは別のレイヤードフォトエディターで画像を開きます。
  2. レイヤーを複製します。
  3. この新しいレイヤーに半径1ピクセルのガウスぼかしを適用します。
  4. レイヤーモードを「差分」に変更します。画像はエッジを除いて黒くなります。
  5. 同様の主題、構成、サイズの既知の鮮明な画像について、手順1〜4を繰り返します。
  6. 2つの差分画像のエッジの強度を比較します。これを目視するか、ヒストグラムを使用できます。

400x480ピクセルの写真と、200x240(50%)に縮小され、次に400x480(200%)に拡大された同じものでこれを試したところ、拡大された写真のエッジがかなり暗くなりました。140%のような穏やかな拡大では決定的ではありませんが、露骨なケースを捕らえます。

いくつかのコンピュータービジョンライブラリには、画像上のガウス分布の差を計算する手段が含まれています。そのため、多くのグラフィカルイメージエディタを使用します。たとえば、GIMPの最近のバージョン。手順2〜4を自動化するDOGマクロを含めます。[フィルター]> [エッジ検出]> [ガウスの差]を選択し、半径を1.0と0.0に設定します。

他のStack Exchangeサイトに関する関連質問:

DOGは最近傍を検出しませんが、上または左に向かって直接隣接するものと同一の行と列のパターンを探すことでそれを行うことができます。

  1. 画像を開きます。
  2. レイヤーを複製します。
  3. 新しいレイヤーを1ピクセル上または左にオフセットします。
  4. レイヤーモードを「差分」に変更します。
  5. 空白行のパターンを探します。

1
拡大された画像に非常に強いアンシャープマスクが適用されている場合はどうなりますか?
してください読むマイプロフィール

1
@mattdmアンシャープマスクはコントラストを高め、高周波の画像コンテンツを作成しません。
Matt Grum、2015

@mattdm USMは高ブーストフィルターですx + amt*(x - GB(x, r))。USMと拡大を組み合わせると、高域は存在しないため、高域ではなく中域(中央の空間周波数)のみがブーストされます。DOG(x、1、0)は高値を分離します。
Damian Yerrick、2015

1

これが一般的な意味で可能であるとは思わない。多くの可能なアップスケーリングアルゴリズムがあり、シグネチャはイメージコンテンツの知識がないと明確に検出することが難しい場合があります(極端な例として、均一な色のアップスケールされた領域は依然として均一な色です...)。

おそらく、エントロピー推定などの画像の複雑さのメトリックを計算するオプションがあります(例:/programming/4935380/get-or-calculate-the-entropy-of-an-image-with -ruby-and-imagemagick)。

多数の画像に対してこれを行うと、コレクション全体の統計を生成できます。次に、それらの統計で外れ値である画像を手動で確認できます。

残念ながら、これは常に誤検知を引き起こし、十分に拡大された画像がキャッチされない可能性があります(ただし、問題がなければ、問題はありませんか?)


私は最後の部分が好きです—誰も言うことができない場合、誰が気にしますか?思い出させるこのXKCD。(警告:乱暴な言葉遣い)
プロフィールを読んでください

0

私はハイブリッドなアプローチを取るでしょう。ガウス分布の違いを使用したり、EXIFや他のメタデータをチェックしたり、FFTを使用したりする他のアイデアは組み合わせることができると思います。別のおそらくより簡単な方法は、単純に各画像を取得し、それを縮小し、再度拡大して比較することです。それらが非常に似ている(おそらくDelta Eのようなものを使用している)場合、それらは拡大された(または別の投稿が示唆するようにぼやけている)可能性があります。おそらく、成功したテストと失敗したテストの数のしきい値を作成できますか?テストの半分以上が合格した場合、それは良好であり、そうでない場合は不良であるか、検証のために人間の介入が必要か、またはそのようなものです。


0

JPEGデータ自体を部分的にアンパックし、簡単なカウントを行うことで、十分に機能するはずです。

JPEGデータは、元の画像データに対して離散コサイン変換を実行し、量子化(高解像度データを破棄)し、結果のDCTブロックをジグザグパターンでウォークスルーし、結果のビットストリームをハフマンコーディングでパッキングすることによって作成されます。

ハフマンコーディングを逆にしてジグザグを元に戻すと、一連の8x8 DCTブロックができます。最低周波数のデータはブロックの左上隅にあり、最高周波数の情報は右下にあります。

つまり、中間形式のデータを文字通り一目で確認し、アップサンプリングされたかどうかを確認できます。これは、8x8のすべてのブロックの左上隅だけが(ほぼ)ゼロ以外の値になるためです。


0

実際にできます

写真を嗅ぐのに犬は必要ありません。移動:

http://rest7.com/image_upscaled

このページで画像をアップロードすると、次のような元のサイズが表示されます。

{
  "is_upscaled": true,
  "current_width": "2000",
  "current_height": "928",
  "original_width": "1750",
  "original_height": "696",
  "accuracy": "82%",
  "accuracy_width": "82%",
  "accuracy_height": "82%",
  "success": 1
}

元の解像度が正しく推測されない場合があります。写真に使用されているアップスケーリングアルゴリズムによって異なります。また、写真が拡大され、JPEG形式に圧縮された場合(30%など)、JPEGアーティファクトによって、このページの推測が困難になることも発見しました。しかし、写真の品質がよく、一般的な方法(Lanczos、Bilinear)を使用して拡大されている場合は、非常に正確です。

以下は2つのサンプル画像です。

元の

https:// i。スタック。imgur。com / iXYKV.png

(申し訳ありませんが、2つ以上のリンクを投稿するのに十分な評判がありません)

アップスケールとクロップド

ここに画像の説明を入力してください

切り抜いた写真を投稿すると、このページに戻ります。

{
  "is_upscaled": true,
  "current_width": "700",
  "current_height": "300",
  "original_width": 352.33333333333,
  "original_height": 151,
  "accuracy": "57%",
  "accuracy_width": "57%",
  "accuracy_height": "57%",
  "cropped": true,
  "success": 1
}

これで、画像が拡大され、トリミングされたことを確認できます。そのままのピクセルから削除されたものに関する情報を取得することは不可能であるため、トリミングの元の画像のサイズはわかりません。


そのサイトは、画像に埋め込まれたデータを信頼できる限り機能します。しかし、そのようなデータを変更するのは簡単です。そして、もし私がお金の市場をだまそうとしているなら、私はデータを右と中央に変えているでしょう。
Peter M

@PeterMどういう意味かよくわかりません。画像をトリミングしますか?このサイトはまだそれが拡大されたことを検出します。
ジャック

画像がクロップされていることをどのようにして知っているかを自問してください。元の画像サイズが何であったかを示す情報はどこに保存されていると思いますか?
Peter M

@PeterMまあ、それがどのように機能するのか正確にはわかりませんが、少し使ってみました。ピクセルを分析し、それに基づいて元の解像度を検出しています。ファイル形式ではなく、ピクセル自体を分析します。したがって、元の解像度はどこにも保存されません。
ジャック

@Jack「ピクセルを分析する」とき、おそらくDOGのようなものを使用します。
Damian Yerrick 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.