问题
我有一个在日本a mountain的数码照片的集合。然而,山常常被云或雾遮蔽。
我可以使用什么技术来检测山在图像中可见?我目前使用Perl与Imager模块,但开放替代品。
所有图像都来自完全相同的位置 – 这些是一些样品。
我天真的解决方案
我开始采取山锥的几个水平像素样本,并将亮度值与来自天空的其他样本进行比较。这对于区分良好图像1和不良图像2很有效。
然而在秋天,它下雪,山变得比天空更亮,像图像3,我的简单亮度测试开始失败。
图像4是边缘情况的示例。我会把这个分类为一个好的形象,因为一些山是清晰可见的。
更新1
谢谢你的建议 – 我很高兴你大大高估了我的能力。
基于答案,我开始尝试ImageMagick edge-detect变换,这给我一个更简单的图像来分析。
convert sample.jpg -edge 1 edge.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();
我运行这个为各种样品图像,我得到的结果如下(卷积图像显示在每个样品下面):
(抱歉 – 上次不同的示例图片!)
现在我想量化一个图像是如何’ridgy’。我试图取图像平均亮度:
$kernel_image->Scale('1x1'); die $kernel_image->GetPixel(x=>1,y=>1)[0];
但这给出不给出有意义的值(0.0165,0.0175和0.0174)。任何更好的方法?
解决方法
我认为你工作的水平太低。快速通过边缘检测滤波器将图像集非常清楚地分割成(1,3)和(2,4)。特别是如果这些图像来自固定的相机视点,在(1)中找到与原型形状的匹配将在算法上相对容易。即使你的情况(4)可以给你一个部分匹配的域,你可以启发式地确定是否有足够的山有考虑。