Подтвердить что ты не робот

На цифровой фотографии, как я могу определить, закрыта ли гора облаками?

Проблема

У меня есть коллекция цифровых фотографий гора в Японии. Однако гора часто скрывается облаками или туманом.

Какие методы я могу использовать, чтобы обнаружить, что гора видна на изображении? В настоящее время я использую 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). Любые лучшие способы?

4b9b3361

Ответ 1

Я думаю, вы работаете на слишком низком уровне. Быстрый проход через фильтр обнаружения края очень четко разделил изображение на (1, 3) и (2, 4). Особенно, если эти изображения приходят с фиксированной точки зрения камеры, найти совпадение с прототипической формой в (1) было бы относительно легко алгоритмически. Даже ваш случай (4) может дать вам область частичного сопоставления, которую вы могли бы эвристически определить, достаточно ли горы, чтобы ее рассмотреть.

Ответ 2

Несколько конкретных рекомендаций, основываясь на том, что у вас уже есть:

  • Возьмите свое лучшее изображение (что-то вроде изображения 1), запустите его через обнаружение края, откройте результат в любом графическом редакторе (MS Paint сделает) и очистите все, кроме верхней границы горы (линия "китайская шляпа" ). Это ядро ​​свертки. Вы можете обрезать его (не изменять размер!) Сверху и снизу, чтобы сэкономить некоторое время на следующем шаге.
  • Используйте функцию Convolve из PerlMagick (кажется, вам уже удобно с Perl и ImageMagick), чтобы сверлить ядро ​​с несколькими изображениями. На полученном изображении вы увидите резкий всплеск, соответствующий "правильному" положению ядра (совпадающему с горой на изображении).
  • Относительная (до уровня окружающего шума) высота этого всплеска будет больше, когда гора станет лучше видна. Используя несколько репрезентативных изображений, вы можете определить порог, который будет отличать хорошие изображения от плохих.
  • Что бы вы ни делали, будут ложные срабатывания и ложные негативы. Будьте готовы.

Ответ 3

Ответ зависит от конкретной проблемы. Если это одна и та же гора из одного и того же POV, запуск и обнаружение края с известным хорошим изображением и использование его в качестве базовой линии для свертки с обнаруженными по краям изображениями из корпуса. Если это только край горы, который вас интересует, вручную удалите другие функции из базовой линии.