问题
我收集了日本a mountain的数码照片。然而,这座山常常被云雾遮挡。
我可以使用哪些技术来检测图像中的山峰是否可见?我目前正在使用带有Imager模块的Perl,但对替代方案持开放态度。
所有图像都是从完全相同的位置拍摄的 - 这些是一些样本。
Sample Images http://www.freeimagehosting.net/uploads/7304a6e191.jpg
我天真的解决方案
我开始采用山锥的几个水平像素样本,并将亮度值与天空中的其他样本进行比较。这对于区分好图像1和坏图像2非常有效。
然而,在秋天,它下雪,山比天空更明亮,就像图像3,我的简单亮度测试开始失败。图像4是边缘情况的示例。我认为这是一个很好的形象,因为有些山峰清晰可见。
更新1
感谢您的建议 - 我很高兴您大大高估了我的能力。
根据答案,我开始尝试ImageMagick edge-detect变换,这给了我一个更简单的图像来分析。
convert sample.jpg -edge 1 edge.jpg
Edge detected samples http://www.freeimagehosting.net/uploads/caa9018d84.jpg
我认为我应该使用某种遮蔽来摆脱树木和大部分云层。
一旦我有了蒙面图像,将相似度与“好”图像进行比较的最佳方法是什么?我想“compare”命令适合这份工作?如何从中获得数字“相似性”值?
更新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)。有更好的方法吗?
答案 0 :(得分:9)
我认为你的工作水平太低了。快速通过边缘检测滤波器将图像集非常清楚地划分为(1,3)和(2,4)。特别是如果这些图像来自固定的摄像机视点,则在(1)中找到与原型形状的匹配在算法上将相对容易。即使你的情况(4)也可以给你一个部分匹配的领域,你可以试探性地确定那里是否有足够的山来考虑。
答案 1 :(得分:5)
基于您已经拥有的建议,提出一些具体的建议:
Convolve
函数(您似乎已经熟悉Perl和ImageMagick)将内核与一些图像进行卷积。在生成的图像上,您应该看到对应于内核“正确”位置的尖锐尖峰(与图像中的山峰重合)。 答案 2 :(得分:4)
答案取决于问题的具体程度。如果它是来自相同POV的相同山峰,则针对已知的良好图像进行运行和边缘检测,并将其用作基线以对来自语料库的边缘检测图像进行卷积。如果它只是您感兴趣的山峰边缘,请从基线中手动删除其他功能。