gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:16:39 25 4
gpt4 key购买 nike

问题

我收藏了 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

我想我应该使用某种 mask 来摆脱树木和大部分云层。

获得蒙版图像后,将相似度与“好”图像进行比较的最佳方法是什么?我猜“ 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, 3) 和 (2, 4)。尤其是如果这些图像来自固定的相机视点,则在算法上找到与 (1) 中的原型(prototype)形状匹配的内容相对容易。即使是 (4) 的情况,也可以为您提供一个部分匹配的域,您可以启发式地确定那里是否有足够的山需要考虑。

关于perl - 在数码照片中,如何检测一座山是否被云层遮挡?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2528356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com