2010-03-27 73 views
27

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

我在日本的a mountain数码照片的集合。然而,这座山常常被云雾遮蔽。

我可以使用哪些技术来检测该山是图像中可见?我目前使用Perl的Imager模块,但可以选择。

所有的图像是从完全相同的位置拍摄 - 这些都是一些样品。

Sample Images http://www.freeimagehosting.net/uploads/7304a6e191.jpg

我天真的

我首先花了山锥的几个水平像素样本和亮度值从天空比较其它样品。这很适合于在秋季下雪2.

但是区分良好形象1和坏的形象和山成为比天空更加明亮,像图像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)。有更好的方法吗?

+4

+1很好提出问题 – msw 2010-03-27 13:52:47

+1

你低估了自己的能力。更新1中与“比较”的链接有许多非常好的方法可以通过卷积来生成一定程度的相似性度量,正如马塞洛所建议的那样。我希望你在打字时摆弄那些东西。 – msw 2010-03-27 14:04:47

回答

9

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

+0

谢谢 - 我已经开始玩边缘检测并更新了问题。仍然有点卡住如何量化有多少山在那里。 – 2010-03-27 13:48:18

4

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

+1

谢谢。幸运的是,问题非常具体 - POV是固定的。边缘检测似乎是正确的开始。我不确定这个复杂的部分。 – 2010-03-27 13:50:21

+0

(对不起,延迟响应;不同的时区)。两幅图像的卷积将显示指示某种相似性的尖峰。如果您只想知道是否有足够的山峰可见,请计算包含山脉边缘的图像与您正在测试的图像之间的卷积。靠近图像中心的强烈峰值会告诉所有人。 – 2010-03-27 21:13:33

5

一些具体建议,一旦你有什么已经建立:

  1. 把你最好的形象(类似图像1),通过边缘检测运行它,打开导致任何图形编辑器(MS油漆将会)并清除除山顶界线(“中国帽子”线)以外的所有东西。这是你的卷积核心。您可以从上面和下面裁剪它(不调整大小!),以节省下一步的时间。
  2. 使用从PerlMagick的Convolve功能(你似乎已经习惯于用Perl和ImageMagick的)与一些图像卷积内核。在最终的图像上,您应该看到与内核“正确”位置相对应的尖峰(与图像中的山体重合)。
  3. 当山峰更好的可见时,此峰值的相对(与周围噪音水平)高度将会更大。通过拍摄几张具有代表性的图像,您可能可以确定一个阈值,将好的图像与坏的图像分开。
  4. 无论你做什么,都会出现误报和误报。做好准备。
+0

感谢您提供分步指南。这对我所处的级别非常有帮助。然而,我有点不确定步骤2的工作原理 - 我如何将“核心”图像传递给卷积函数 - 它似乎只采用系数矩阵? – 2010-03-28 10:09:03

+0

@Gavin:内核==矩阵。我试着找到一些适合你的卷积的解释,但找不到任何东西 - 也许你应该尝试一下。 – AVB 2010-03-28 15:19:02

+0

经过多次黑客攻击之后,我使用了$ test_image-> GetPixels()作为系数 - 是否有效?我再次更新了这篇文章。 – 2010-03-28 16:36:03

相关问题