问题
我有一组日本一座山的数字照片。然而,这座山经常被云雾遮挡。
我可以使用哪些技术来检测图像中山是否可见?我目前正在使用带有Imager模块的Perl,但也愿意尝试其他方法。
所有的图片都是从同一个位置拍摄的-这是一些样本。
示例图片http://www.freeimagehosting.net/uploads/7304a6e191.jpg
我的天真解决方案
我开始对山锥进行多个水平像素样本,并将亮度值与天空的其他样本进行比较。这对于区分好的图像1和坏的图像2效果很好。
然而,在秋季下雪后,山变得比天空更亮,就像图3一样,我的简单亮度测试开始失败。
图4是一个边缘情况的例子。我会将其分类为好的图像,因为山的某些部分明显可见。
更新1
感谢您的建议-我很高兴你们都大大高估了我的能力。
根据答案,我已经开始尝试使用ImageMagick边缘检测转换,这给了我一个更简单的图像来分析。
convert sample.jpg -edge 1 edge.jpg
检测边缘样本 http://www.freeimagehosting.net/uploads/caa9018d84.jpg
我认为我应该使用某种掩蔽来消除树木和大部分云层。
一旦我有了掩蔽图像,最好的方法是如何将其与“好”图像进行比较?我想“比较”命令适合这项工作?我如何从中获得数值“相似度”?
更新2
我想我可能正在使用卷积。
我通过对良好图像执行边缘检测来制作我的“内核”图像(下面的图像顶部)。然后,我在山的轮廓周围涂黑了所有的“噪声”,然后将其裁剪。
然后我使用了以下代码:
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();
我对各种样本图像运行了此操作,并获得了以下结果(每个样本下方显示了卷积后的图像):
(抱歉-与上次不同的样本图像!)
alt text http://www.freeimagehosting.net/uploads/f9a5a34980.jpg
现在我正在尝试量化图像的“崎岖程度”。 我尝试获取图像的平均亮度:
$kernel_image->Scale('1x1');
die $kernel_image->GetPixel(x=>1,y=>1)[0];
但是这样做并不能得到有意义的值(0.0165、0.0175 和 0.0174)。还有更好的方法吗?