Проблема
У меня есть коллекция цифровых фотографий гора в Японии. Однако гора часто скрывается облаками или туманом.
Какие методы я могу использовать, чтобы обнаружить, что гора видна на изображении? В настоящее время я использую Perl с модулем Imager, но открываю альтернативы.
Все изображения взяты из одной и той же позиции - это некоторые образцы.
Образцы изображений http://www.freeimagehosting.net/uploads/7304a6e191.jpg
Мое наивное решение
Я начал с нескольких образцов горизонтального пикселя горного конуса и сравнения значений яркости с другими образцами с неба. Это хорошо работало для дифференциации хорошего изображения 1 и плохого изображения 2.
Однако осенью снег, и гора стала ярче, чем небо, как изображение 3, и мой простой тест яркости начал проваливаться.
Изображение 4 - пример краевого случая. Я бы классифицировал это как хорошее изображение, так как некоторые горы хорошо видны.
ОБНОВЛЕНИЕ 1
Благодарим вас за предложения - я счастлив, что вы очень сильно переоценили мою компетентность.
Исходя из ответов, я начал пробовать ImageMagick edge-detect, что дает мне гораздо более простой образ для анализа.
convert sample.jpg -edge 1 edge.jpg
Обнаруженные грани обнаружены http://www.freeimagehosting.net/uploads/caa9018d84.jpg
Я предполагаю, что я должен использовать какую-то маскировку, чтобы избавиться от деревьев и большинства облаков.
Как только у меня есть изображение в масках, какой лучший способ сравнить сходство с "хорошим" изображением? Я полагаю, что команда compare подходит для этой работы? Как получить цифровую "подобие" из этого?
ОБНОВЛЕНИЕ 2
Я думаю, что я могу быть где-то со сверткой.
Я сделал свое изображение "kernel" (вверху изображения ниже), выполнив обнаружение края на хорошем изображении. Затем я затемнул весь "шум" вокруг контура горы, а затем обрезал его.
Затем я использовал следующий код:
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();
Я запускал это для различных образцов изображений, и я получил результаты, как показано ниже (свернутое изображение показано ниже каждого образца):
(Извините - разные образцы изображений из прошлого раза!)
alt text 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). Любые лучшие способы?