27

問題

日本の山のデジタル写真のコレクションを持っています。しかし、山はしばしば雲や霧に覆われています。

山が画像に表示されていることを検出するには、どのような手法を使用できますか?私は現在、ImagerモジュールでPerlを使用していますが、別の方法を利用できます。

すべての画像はまったく同じ位置から取得されています-これらはいくつかのサンプルです。

サンプル画像http://www.freeimagehosting.net/uploads/7304a6e191.jpg

私のナイーブな解決策

山の円錐のいくつかの水平ピクセルサンプルを取得し、明るさの値を空の他のサンプルと比較することから始めました。これは、良い画像1と悪い画像2を区別するためにうまく機能しました。

しかし、秋になると雪が降り、画像3のように山が空よりも明るくなり、簡単な明るさテストが失敗し始めました。

画像4はエッジケースの例です。山の一部がはっきりと見えるので、これを良い画像として分類します。

更新1

提案をありがとう-あなたが私の能力を非常に過大評価してくれてうれしいです。

答えに基づいて、私はImageMagickエッジ検出変換を試し始めました。これにより、分析する画像がはるかに簡単になります。

convert sample.jpg -edge 1 edge.jpg

エッジで検出されたサンプルhttp://www.freeimagehosting.net/uploads/caa9018d84.jpg

木やほとんどの雲を取り除くために、ある種のマスキングを使用する必要があると思います。

マスクされた画像を取得したら、類似性を「良好な」画像と比較するための最良の方法は何ですか?この仕事に適した「比較」コマンドだと思いますか?これから数値の「類似性」値を取得するにはどうすればよいですか?

更新2

たたみ込みでどこかに到達しているのではないかと思います。

良好な画像に対してエッジ検出を実行して、「カーネル」画像(下の画像の上部)を作成しました。次に、山の輪郭の周りのすべての「ノイズ」を黒く塗りつぶしてからトリミングしました。

次に、次のコードを使用しました。

use Image::Magick;

# Edge detect the test image
my $test_image = Image::Magick->new;
$test_image->Read($ARGV[0]);
$test_image->Quantize(colorspace=>'gray');
$test_image->Edge(radius => 1);

# Load the kernel
my $kernel_image = Image::Magick->new;
$kernel_image->Read('kernel-crop.jpg');

# Convolve and show the result
$kernel_image->Convolve(coefficients => [$test_image->GetPixels()]);
$kernel_image->Display();

これをさまざまなサンプル画像に対して実行したところ、次のような結果が得られました(畳み込み画像は各サンプルの下に表示されています)。

(申し訳ありませんが、前回とは異なるサンプル画像です!)

代替テキストhttp://www.freeimagehosting.net/uploads/f9a5a34980.jpg

今、私は画像がどれほど「ぎこちない」かを定量化しようとしています。画像の平均輝度を試してみました:

$kernel_image->Scale('1x1');
die $kernel_image->GetPixel(x=>1,y=>1)[0];

ただし、これでは意味のある値(0.0165、0.0175、0.0174)は得られません。より良い方法はありますか?

4

3 に答える 3

9

あなたは低すぎるレベルに取り組んでいると思います。エッジ検出フィルターをすばやく通過すると、画像セットが(1、3)と(2、4)に非常に明確に分割されます。特に、これらの画像が固定カメラの視点からのものである場合、(1)の典型的な形状との一致を見つけることはアルゴリズム的に比較的簡単です。(4)の場合でも、部分一致のドメインが得られ、そこに検討するのに十分な山があるかどうかをヒューリスティックに判断できます。

于 2010-03-27T06:36:56.037 に答える
5

あなたがすでに持っているものに基づいて構築された、いくつかの具体的な推奨事項:

  1. 最良の画像 (画像 1 のようなもの) を取得し、エッジ検出を実行し、結果を任意のグラフィック エディター (MS ペイントで実行できます) で開き、山頂の境界 (「チャイニーズ ハット」ライン) 以外のすべてを消去します。これが畳み込みカーネルです。次のステップで時間を節約するために、上下から切り取ることができます (サイズ変更ではありません)。
  2. ConvolvePerlMagickの関数 (既に Perl と ImageMagick に慣れているようです) を使用して、いくつかの画像でカーネルを畳み込みます。結果の画像には、カーネルの「正しい」位置に対応する鋭いスパイクが表示されます (画像の山と一致しています)。
  3. このスパイクの相対的な (周囲のノイズのレベルに対する) 高さは、山がよく見えるほど高くなります。いくつかの代表的な画像を取得することで、良い画像と悪い画像を区別するしきい値を決定できる場合があります。
  4. 何をしても、偽陽性と偽陰性が発生します。準備して。
于 2010-03-27T22:51:21.843 に答える
4

答えは、問題がどれほど具体的かによって異なります。同じPOVの同じ山である場合は、既知の良好な画像に対して実行およびエッジ検出を行い、コーパスからのエッジ検出画像に対して畳み込みを行うためのベースラインとして使用します。関心のあるのが山の端だけの場合は、ベースラインから他のフィーチャを手動で削除します。

于 2010-03-27T06:40:45.110 に答える