El problemaEn una fotografía digital, ¿cómo puedo detectar si una montaña está oscurecida por las nubes?
que tienen una colección de fotos digitales de a mountain en Japón. Sin embargo, la montaña a menudo está oscurecida por nubes o niebla.
¿Qué técnicas puedo usar para detectar que la montaña es visible en la imagen? Actualmente estoy usando Perl con el módulo Imager, pero estoy abierto a otras alternativas.
Todas las imágenes se toman desde la misma posición exacta - estas son algunas muestras.
Sample Images http://www.freeimagehosting.net/uploads/7304a6e191.jpg
Mi solución ingenua
Empecé tomando varias muestras de píxeles horizontales del cono de la montaña y la comparación de los valores de brillo a otras muestras del cielo. Esto funcionó bien para distinguir buena imagen 1 y mala imagen 2.
Sin embargo, en el otoño nevó y la montaña se hizo más brillante que el cielo, como la imagen 3, y mi prueba de brillo simple comenzó a fallar.
La imagen 4 es un ejemplo de una carcasa de borde. Clasificaría esto como una buena imagen ya que parte de la montaña es claramente visible.
ACTUALIZA 1
Gracias por las sugerencias - Estoy feliz de que todo muy sobreestimada mi competencia.
Basado en las respuestas, he comenzado a probar la transformación ImageMagick edge-detect, lo que me da una imagen mucho más simple de analizar.
convert sample.jpg -edge 1 edge.jpg
Edge detected samples http://www.freeimagehosting.net/uploads/caa9018d84.jpg
Asumo que debería utilizar algún tipo de enmascaramiento para deshacerse de los árboles y la mayoría de las nubes.
Una vez que tengo la imagen enmascarada, ¿cuál es la mejor manera de comparar la similitud con una "buena" imagen? Supongo que el comando "compare" es adecuado para este trabajo? ¿Cómo obtengo un valor de 'similitud' numérico de esto?
ACTUALIZACIÓN 2
Creo que puede llegar a alguna parte con la convolución.
Hice mi imagen 'kernel' (parte superior de la imagen a continuación) realizando detección de bordes en una buena imagen. Luego apagué todo el 'ruido' alrededor del contorno de la montaña y luego lo recorté.
Luego utiliza el siguiente código:
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();
me encontré con esto para diversas imágenes de la muestra, y me dieron los resultados de la siguiente manera (se muestra la imagen convuelta debajo de cada muestra):
(Lo siento - ¡diferentes imágenes de muestra de la última vez!)
alt text http://www.freeimagehosting.net/uploads/f9a5a34980.jpg
Ahora estoy tratando de cuantificar la 'ridgy' es una imagen. Traté de tomar la imagen de brillo medio:
$kernel_image->Scale('1x1');
die $kernel_image->GetPixel(x=>1,y=>1)[0];
Pero esto da no da valores significativos (0,0165, 0,0175 y 0,0174). ¿Alguna mejor manera?
+1 muy bien presentado pregunta – msw
Está subestimando su propia competencia. Ese enlace para "comparar" en la Actualización 1 tiene varios enfoques muy buenos para generar un grado de medida de similitud a través de la convolución, como sugirió Marcelo. Supongo que estás jugueteando con esos mientras escribo. – msw