在数码照片中,如何检测山脉是否被云层遮盖?
image-processing
imagemagick
object-detection
perl
12
0

问题

我收集了日本一座山的数码照片。但是,这座山经常被云雾笼罩。

我可以使用哪些技术来检测图像中可见山峰?我目前将Perl与Imager模块一起使用,但可以选择。

所有图像都是从完全相同的位置拍摄的-这些是一些示例。

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

我天真的解决方案

我首先获取了山锥的几个水平像素样本,并将亮度值与天空中的其他样本进行比较。这对于区分好图像1和差的图像2效果很好。

但是在秋天下雪了,山变得比天空亮,就像图3一样,我简单的亮度测试开始失败了。

图像4是边缘盒的示例。我将其归类为好图像,因为其中一些山清晰可见。

更新1

谢谢您的建议-我很高兴大家都高估了我的能力。

根据答案,我已经开始尝试ImageMagick边缘检测变换,这使我可以分析更简单的图像。

convert sample.jpg -edge 1 edge.jpg

边缘检测到的样本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();

我针对各种示例图像运行了此操作,结果如下(卷积图像显示在每个示例下方):

(对不起-与上次不同的示例图像!)

替代文字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)。还有更好的方法吗?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

我认为您的工作水平太低。快速通过边缘检测过滤器将图像集非常明显地分为(1,3)和(2,4)。尤其是如果这些图像来自固定的摄像机视点,则在算法(1)中找到与原型形状的匹配将相对容易。即使是(4)的情况,也可以为您提供部分匹配的域,您可以试探性地确定那里是否有足够的山脉要考虑。

收藏
评论

根据您已有的内容,提出一些具体建议:

  1. 拍摄最佳图像(类似于图像1),通过边缘检测运行它,在任何图形编辑器中打开结果(MS Paint可以完成),并清洁除山顶边界(“中国帽”线)之外的所有内容。这就是卷积内核。您可以从上方和下方进行裁剪(不调整大小!),以节省下一步的时间。
  2. 使用Convolve函数(您似乎已经对Perl和ImageMagick感到满意)将内核与一些图像进行卷积。在生成的图像上,您应该看到一个对应于内核“正确”位置的尖峰(与图像中的山峰重合)。
  3. 当山峰清晰可见时,此尖峰的相对(相对于周围噪声的高度)高度会更大。通过拍摄几张代表性图像,您可能能够确定将好图像与坏图像分开的阈值。
  4. 无论您做什么,都会有误报和误报。做好准备
收藏
评论

答案取决于问题的具体程度。如果它是来自同一POV的同一山峰,则针对已知的良好图像进行运行和边缘检测,并将其用作与来自主体的边缘检测图像进行卷积的基线。如果只是您感兴趣的山峰边缘,请从基准线中手动删除其他要素。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题