mac descargar convert perl image-processing imagemagick object-detection

perl - descargar - imagemagick ubuntu



En una foto digital, ¿cómo puedo detectar si una montaña está oscurecida por las nubes? (3)

El problema

Tengo una colección de fotos digitales de una montaña 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.

Imágenes de muestra http://www.freeimagehosting.net/uploads/7304a6e191.jpg

Mi ingenua solución

Comencé tomando varias muestras de píxeles horizontales del cono de montaña y comparando los valores de brillo con otras muestras del cielo. Esto funcionó bien para diferenciar una buena imagen 1 y una 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 caja de borde. Clasificaría esto como una buena imagen ya que parte de la montaña es claramente visible.

ACTUALIZACIÓN 1

Gracias por las sugerencias. Me alegra que hayan exagerado ampliamente mi competencia.

En base a las respuestas, comencé a probar la transformación de detección de bordes ImageMagick , que me da una imagen mucho más simple de analizar.

convert sample.jpg -edge 1 edge.jpg

Edge detectó muestras http://www.freeimagehosting.net/uploads/caa9018d84.jpg

Supongo que debería usar algún tipo de máscara para deshacerme 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 " adecuado para este trabajo? ¿Cómo obtengo un valor de ''similitud'' numérico de esto?

ACTUALIZACIÓN 2

Creo que puedo llegar a algún lado con convolve.

Hice mi imagen ''kernel'' (arriba 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 utilicé 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();

Ejecuté esto para varias imágenes de muestra, y obtuve resultados como a continuación (la imagen convolucionada se muestra debajo de cada muestra):

(Lo siento, ¡diferentes imágenes de muestra de la última vez!)

texto alternativo http://www.freeimagehosting.net/uploads/f9a5a34980.jpg

Ahora estoy tratando de cuantificar cuán ''ridícula'' es una imagen. Intenté tomar el brillo promedio de la imagen:

$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?


Algunas recomendaciones específicas, basadas en lo que ya tienes:

  1. Tome su mejor imagen (algo así como la imagen 1), ejecute a través de detección de bordes, abra el resultado en cualquier editor gráfico (MS Paint lo hará) y limpie todo excepto el límite superior de la montaña (la línea "sombrero chino"). Este es tu kernel de convolución. Puede recortarlo (¡no cambiar el tamaño!) Desde arriba y abajo para ahorrar tiempo en el siguiente paso.
  2. Utilice la función Convolve de PerlMagick (parece que ya se siente cómodo con Perl e ImageMagick) para convolucionar el kernel con unas pocas imágenes. En la imagen resultante, debe ver una punta afilada correspondiente a la posición "correcta" del núcleo (coincidiendo con la montaña de la imagen).
  3. La altura relativa (hasta el nivel de ruido circundante) de este pico será mayor cuando la montaña sea más visible. Al tomar varias imágenes representativas, es posible que pueda determinar un umbral que separe las buenas imágenes de las malas.
  4. Hagas lo que hagas, habrá falsos positivos y falsos negativos. Estar preparado.

Creo que estás trabajando en un nivel demasiado bajo. Un pase rápido a través de un filtro de detección de bordes particionó la imagen configurada muy claramente en (1, 3) y (2, 4). Especialmente si estas imágenes provienen de un punto de vista fijo de la cámara, encontrar una coincidencia con la forma prototípica en (1) sería relativamente fácil algorítmicamente. Incluso su caso de (4) podría darle un dominio de coincidencia parcial que podría determinar heurísticamente si había suficiente montaña para considerar.


La respuesta depende de qué tan específico es el problema. Si se trata de la misma montaña desde el mismo punto de vista, ejecute la detección de bordes contra una buena imagen conocida y utilícela como línea base para la convolución contra las imágenes detectadas en el borde del corpus. Si solo le interesa el borde de la montaña, elimine manualmente otras características de la línea base.