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

Gav*_*ock 27 perl imagemagick image-processing object-detection

问题

我收集了日本一座山的数码照片.然而,这座山常常被云雾遮挡.

我可以使用哪些技术来检测图像中的山峰是否可见?我目前正在使用带有Imager模块的Perl ,但对替代品开放.

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

样本图像http://www.freeimagehosting.net/uploads/7304a6e191.jpg

我天真的解决方案

我开始采用山锥的几个水平像素样本,并将亮度值与天空中的其他样本进行比较.这适用于区分好图像1和坏图像2.

然而在秋天,它下雪了,山比天空更明亮,就像图像3一样,我的简单亮度测试开始失败.

图4是边缘情况的示例.我认为这是一个很好的形象,因为有些山峰清晰可见.

更新1

谢谢你们的建议 - 我很高兴你们都高估了我的能力.

根据答案,我开始尝试使用ImageMagick边缘检测变换,这使我能够分析更简单的图像.

convert sample.jpg -edge 1 edge.jpg
Run Code Online (Sandbox Code Playgroud)

边缘检测样本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();
Run Code Online (Sandbox Code Playgroud)

我为各种样本图像运行了这个,我得到如下结果(每个样本下面都显示了卷积图像):

(对不起 - 上次不同的样本图片!)

alt text http://www.freeimagehosting.net/uploads/f9a5a34980.jpg

现在我试图量化图像的'ridgy'.我尝试拍摄图像的平均亮度:

$kernel_image->Scale('1x1');
die $kernel_image->GetPixel(x=>1,y=>1)[0];
Run Code Online (Sandbox Code Playgroud)

但是这给出了没有给出有意义的值(0.0165,0.0175和0.0174).有更好的方法吗?

msw*_*msw 9

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


AVB*_*AVB 5

一些具体的建议,以你已经拥有的为基础:

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