The problem
I have a collection of digital photos of a mountain in Japan. However the mountain is often obscured by clouds or fog.
What techniques can I use to detect that the mountain is visible in the image? I am currently using Perl with the Imager module, but open to alternatives.
All the images are taken from the exact same position - these are some samples.
Sample Images http://www.freeimagehosting.net/uploads/7304a6e191.jpg
My naïve solution
I started by taking several horizontal pixel samples of the mountain cone and comparing the brightness values to other samples from the sky. This worked well for differentiating good image 1 and bad image 2.
However in the autumn it snowed and the mountain became brighter than the sky, like image 3, and my simple brightness test started to fail.
Image 4 is an example of an edge case. I would classify this as a good image since some of the mountain is clearly visible.
UPDATE 1
Thank you for the suggestions - I am happy you all vastly over-estimated my competence.
Based on the answers, I have started trying the ImageMagick edge-detect transform, which gives me a much simpler image to analyze.
convert sample.jpg -edge 1 edge.jpg
Edge detected samples http://www.freeimagehosting.net/uploads/caa9018d84.jpg
I assume I should use some kind of masking to get rid of the trees and most of the clouds.
Once I have the masked image, what is the best way to compare the similarity to a good image? I guess the "compare" command suited for this job? How do I get a numeric similarity value from this?
UPDATE 2
I think I may be getting somewhere with convolve.
I made my kernel image (top of the image below) by performing edge detect on a good image. I then blacked out all the noise around the outline of the mountain and then cropped it.
I then used the following 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();
I ran this for various sample images, and I got results as below (the convolved image is shown below each sample):
(Sorry - different sample images from last time!)
alt text http://www.freeimagehosting.net/uploads/f9a5a34980.jpg
Now I am trying to quantify how ridgy an image is. I tried taking the image average brightness:
$kernel_image->Scale( 1x1 );
die $kernel_image->GetPixel(x=>1,y=>1)[0];
But this gives does not give meaningful values (0.0165, 0.0175 and 0.0174). Any better ways?