Le problème
J'ai une collection de photos numériques d' une montagne au Japon. Cependant, la montagne est souvent obscurci par les nuages ou le brouillard.
Quelles sont les techniques que je peux utiliser pour détecter que la montagne est visible dans l'image? Je suis actuellement en utilisant Perl avec l' Imageur module, mais ouvert à d'autres options.
Toutes les images sont prises à partir de la même position - ces quelques exemples.
Ma solution naïve
J'ai commencé par la prise de plusieurs pixel horizontal échantillons de la montagne cône et en comparant les valeurs de luminosité à d'autres échantillons provenant du ciel. Cela a bien fonctionné pour différencier une bonne image 1 et de la mauvaise image 2.
Cependant, à l'automne il a neigé et la montagne devient plus lumineux que le ciel, comme l'image 3, et mon luminosité simple test a commencé à échouer.
Image 4 est un exemple d'un cas limite. Je classerais ce qu'une bonne image depuis quelques de la montagne est clairement visible.
Mise à JOUR 1
Merci pour les suggestions - je suis heureux que vous tous les largement sur-estimé ma compétence.
Sur la base des réponses, j'ai commencé à essayer le ImageMagick bord-détecter les transformer, ce qui me donne beaucoup plus simple de l'image à analyser.
convert sample.jpg -edge 1 edge.jpg
Je suppose que je devrais utiliser une sorte de masquage pour se débarrasser de l'arbre et de 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 pense que les "comparer" commande adapté pour ce travail? Comment puis-je obtenir un numérique "similitude" la valeur de tout cela?
Mise à JOUR 2
Je pense que j'ai peut-être trouvé quelque part avec de convolution.
J'ai fait mon 'noyau' de l'image (en haut de l'image ci-dessous) en effectuant bord de détecter sur une bonne image. J'ai ensuite masqués, tout le "bruit" autour de la silhouette de la montagne, et rognée.
Ensuite, j'ai 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 ce pour divers exemples d'images, et j'ai obtenu des résultats comme ci-dessous (l'image convoluée est indiqué en dessous de chaque échantillon):
(Désolé - différents exemples d'images de la dernière fois!)
Maintenant, je suis en train d'essayer de quantifier comment "ridgy" une image. J'ai essayé de prendre l'image la luminosité moyenne:
$kernel_image->Scale('1x1');
die $kernel_image->GetPixel(x=>1,y=>1)[0];
Mais ce qui donne ne donne pas de valeurs significatives (0.0165, de 0,0175 et 0.0174). Les meilleures façons?