Проблема
У меня есть набор цифровых фотографий горы в Японии. Однако гора часто затеняется облаками или вуалью.
Какие методы я могу использовать, чтобы обнаружить, что гора видима в изображении? Я в настоящее время использую 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
Теперь я пытаюсь определить количество, как 'ridgy' изображение. Я пытался брать среднюю яркость изображения:
$kernel_image->Scale('1x1');
die $kernel_image->GetPixel(x=>1,y=>1)[0];
Но это дает, не дает значимые значения (0.0165, 0.0175 и 0.0174). Какие-либо лучшие пути?
Несколько конкретных рекомендаций, основанных на том, что у вас уже есть:
Convolve
из PerlMagick (вы, кажется, уже знакомы с Perl и ImageMagick), чтобы свернуть ядро с несколькими изображениями. На получившемся изображении вы должны увидеть резкий шип, соответствующий «правильному» положению ядра (совпадающий с горой на изображении). Думаю, вы работаете на слишком низком уровне. Быстрый проход через фильтр обнаружения краев очень четко разделил набор изображений на (1, 3) и (2, 4). Особенно, если эти изображения получены с фиксированной точки обзора камеры, найти совпадение с прототипной формой в (1) будет относительно легко с алгоритмической точки зрения. Даже ваш случай (4) может дать вам область частичного сопоставления, которую вы могли бы эвристически определить, достаточно ли там горы для рассмотрения.
Ответ зависит от того, насколько конкретна проблема. Если это одна и та же гора из одного и того же POV, обнаружение бега и краев по заведомо исправному изображению и использование его в качестве основы для свертки по изображениям, обнаруженным по краям из корпуса. Если вас интересует только край горы, вручную удалите другие объекты из базовой линии.