Le problèmeSur une photo numérique, comment puis-je détecter si une montagne est obscurcie par des nuages?
J'ai une collection de photos numériques de a mountain au Japon. Cependant, la montagne est souvent obscurcie par les nuages ou le brouillard. Quelles techniques puis-je utiliser pour détecter que la montagne est visible dans l'image?
Quelles techniques puis-je utiliser pour détecter que la montagne est visible dans l'image? J'utilise actuellement Perl avec le module Imager, mais ouvert aux alternatives.
Toutes les images proviennent de la même position exacte - il s'agit de quelques exemples.
Sample Images http://www.freeimagehosting.net/uploads/7304a6e191.jpg
Ma solution naïve
j'ai commencé en prenant plusieurs échantillons de pixels horizontaux du cône de montagne et en comparant les valeurs de luminosité à d'autres échantillons du ciel. Cependant, à l'automne, il a neigé et la montagne est devenue plus claire que le ciel, comme l'image 3, et mon test de luminosité simple a commencé à échouer.
L'image 4 est un exemple d'un cas de bordure. Je classerais cela comme une bonne image car une partie de la montagne est clairement visible.
MISE À JOUR 1
Merci pour les suggestions - Je suis heureux que vous tous largement surestimés ma compétence. Basé sur les réponses, j'ai commencé à essayer la transformation ImageMagick edge-detect, ce qui me donne une image beaucoup plus simple à analyser.
convert sample.jpg -edge 1 edge.jpg
Edge detected samples http://www.freeimagehosting.net/uploads/caa9018d84.jpg
Je suppose que je devrais utiliser une sorte de masquage pour se débarrasser des arbres et la plupart des nuages.
Une fois que j'ai l'image masquée, quelle est la meilleure façon de comparer la similarité à une «bonne» image? Je suppose que la commande "compare" convient à ce travail? Comment puis-je obtenir une valeur de «similarité» numérique à partir de cela?
MISE À JOUR 2
Je pense que je suis quelque part avec convolve en venir.
J'ai fait mon image 'noyau' (en haut de l'image ci-dessous) en effectuant une détection de bord sur une bonne image. J'ai ensuite noirci tout le 'bruit' autour du contour de la montagne et l'ai ensuite recadré.
J'ai ensuite utilisé le code suivant:
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();
J'ai couru ceci pour diverses exemples d'images, et j'ai obtenu des résultats comme ci-dessous (l'image convoluée est illustré ci-dessous chaque échantillon):
(Désolé - Différentes images d'échantillons de la dernière fois!)
alt text http://www.freeimagehosting.net/uploads/f9a5a34980.jpg
Maintenant, je suis en train de quantifier 'ridgy' une image est. J'ai essayé de prendre l'image de luminosité moyenne:
$kernel_image->Scale('1x1');
die $kernel_image->GetPixel(x=>1,y=>1)[0];
Mais cela donne ne donne pas de valeurs significatives (0,0165, 0,0175 et 0,0174). De meilleures façons?
+1 très bien présenté question – msw
Vous sous-estimez votre propre compétence. Ce lien vers «comparer» dans la mise à jour 1 comporte un certain nombre de très bonnes approches pour générer un degré de similarité par convolution, comme le suggérait Marcelo. Je m'attends à ce que vous jouiez avec ceux que je tape. – msw