在数码照片中,我如何检测一座山是否被云遮蔽?

时间:2010-03-27 06:13:40

标签: perl image-processing imagemagick object-detection

问题

我收集了日本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)。有更好的方法吗?

3 个答案:

答案 0 :(得分:9)

我认为你的工作水平太低了。快速通过边缘检测滤波器将图像集非常清楚地划分为(1,3)和(2,4)。特别是如果这些图像来自固定的摄像机视点,则在(1)中找到与原型形状的匹配在算法上将相对容易。即使你的情况(4)也可以给你一个部分匹配的领域,你可以试探性地确定那里是否有足够的山来考虑。

答案 1 :(得分:5)

基于您已经拥有的建议,提出一些具体的建议:

  1. 拍摄最佳图像(如图1所示),通过边缘检测运行,在任何图形编辑器中打开结果(MS Paint会这样做)并清除除山顶边界(“中国帽子”线)以外的所有内容。这是你的卷积内核。您可以从上方和下方裁剪它(不调整大小!)以节省下一步的时间。
  2. 使用PerlMagick中的Convolve函数(您似乎已经熟悉Perl和ImageMagick)将内核与一些图像进行卷积。在生成的图像上,您应该看到对应于内核“正确”位置的尖锐尖峰(与图像中的山峰重合)。
  3. 当山峰更清晰可见时,此峰值的相对高度(对周围噪声的高度)将更大。通过拍摄几张具有代表性的图像,您可以确定将好图像与坏图像分开的阈值。
  4. 无论你做什么,都会有误报和漏报。做好准备。

答案 2 :(得分:4)

答案取决于问题的具体程度。如果它是来自相同POV的相同山峰,则针对已知的良好图像进行运行和边缘检测,并将其用作基线以对来自语料库的边缘检测图像进行卷积。如果它只是您感兴趣的山峰边缘,请从基线中手动删除其他功能。