perl – 在数码照片中,我如何检测一个山是否被云遮蔽?
问题
我有一个在日本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)可以给你一个部分匹配的域,你可以启发式地确定是否有足够的山有考虑。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |