Das ProblemWie erkenne ich in einem digitalen Foto, ob ein Berg von Wolken verdeckt ist?
Ich habe eine Sammlung von digitalen Fotos von a mountain in Japan. Allerdings ist der Berg oft von Wolken oder Nebel verdeckt.
Welche Techniken kann ich verwenden, um zu erkennen, dass der Berg im Bild sichtbar ist? Ich verwende derzeit Perl mit dem Imager Modul, aber offen für Alternativen.
Alle Bilder werden von genau derselben Position aufgenommen - dies sind einige Beispiele.
Sample Images http://www.freeimagehosting.net/uploads/7304a6e191.jpg
Meine naive Lösung
Ich begann durch mehrere horizontale Pixelproben des Bergkegel zu nehmen und die Helligkeitswerte auf andere Proben aus dem Himmel zu vergleichen. Dies funktionierte gut, um gutes Bild 1 und schlechtes Bild 2 zu unterscheiden.
Allerdings schneite es im Herbst und der Berg wurde heller als der Himmel, wie Bild 3, und mein einfacher Helligkeitstest begann zu versagen.
Bild 4 ist ein Beispiel für einen Randfall. Ich würde dies als ein gutes Bild einstufen, da ein Teil des Berges deutlich zu sehen ist.
UPDATE 1
Vielen Dank für die Anregungen - Ich bin glücklich, Sie alle in beträchtlichem Ausmaß meine Kompetenz überschätzt.
Basierend auf den Antworten habe ich versucht, die ImageMagick edge-detect Transformation, die mir ein viel einfacheres Bild zu analysieren gibt.
convert sample.jpg -edge 1 edge.jpg
Edge detected samples http://www.freeimagehosting.net/uploads/caa9018d84.jpg
Ich nehme ich eine Art Maskierung benutzen soll, um von den Bäumen loszuwerden und die meisten der Wolken.
Sobald ich das maskierte Bild habe, was ist der beste Weg, die Ähnlichkeit mit einem "guten" Bild zu vergleichen? Ich denke, der Befehl "compare" ist für diesen Job geeignet? Wie bekomme ich daraus einen numerischen "Ähnlichkeits" -Wert?
UPDATE 2
glaube ich irgendwo mit convolve werden zu bekommen.
Ich habe mein "Kernel" -Bild (oben im Bild unten) gemacht, indem ich Kantenerkennung auf einem guten Bild durchgeführt habe. Ich verdunkelte dann den ganzen Lärm um den Umriss des Berges und schnitt ihn dann ab.
habe ich dann den folgenden Code:
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();
ich dies für verschiedene Beispielbilder lief, und ich habe Ergebnisse, wie unten (das gefaltete Bild unterhalb jeder Probe gezeigt wird):
(Leider - verschiedene Beispielbilder vom letzten Mal!)
alt text http://www.freeimagehosting.net/uploads/f9a5a34980.jpg
Jetzt versuche ich, wie 'ridgy' zu quantifizieren ein Bild ist. Ich versuchte, nehmen Sie das Bild durchschnittliche Helligkeit:
$kernel_image->Scale('1x1');
die $kernel_image->GetPixel(x=>1,y=>1)[0];
Aber dies gibt keine sinnvollen Werte (0,0165, 0,0175 und 0,0174) nicht geben. Irgendwelche besseren Möglichkeiten?
+1 sehr gut präsentierte Frage – msw
Sie unterschätzt Ihre eigene Kompetenz. Dieser Link zum "Vergleichen" in Update 1 hat eine Reihe sehr guter Ansätze, um einen Grad an Ähnlichkeitsmaß durch Faltung zu erzeugen, wie Marcelo vorgeschlagen hat. Ich nehme an, du tüftelst mit denen, während ich tippe. – msw