【发布时间】:2011-02-01 11:17:03
【问题描述】:
问题
我在日本收藏了a mountain 的数码照片。然而,这座山经常被云或雾遮住。
我可以使用哪些技术来检测图像中的山是否可见?我目前正在将 Perl 与 Imager 模块一起使用,但对替代方案持开放态度。
所有图片都是从完全相同的位置拍摄的 - 这些是一些样本。
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)。还有更好的方法吗?
【问题讨论】:
-
+1 个很好的问题
-
你低估了自己的能力。正如 Marcelo 所建议的那样,Update 1 中的“比较”链接有许多非常好的方法可以通过卷积生成一定程度的相似性度量。我希望你在我打字的时候摆弄那些。
标签: perl image-processing imagemagick object-detection