Gav*_*ock 27 perl imagemagick image-processing object-detection
问题
我收集了日本一座山的数码照片.然而,这座山常常被云雾遮挡.
我可以使用哪些技术来检测图像中的山峰是否可见?我目前正在使用带有Imager模块的Perl ,但对替代品开放.
所有图像都是从完全相同的位置拍摄的 - 这些是一些样本.
样本图像http://www.freeimagehosting.net/uploads/7304a6e191.jpg
我天真的解决方案
我开始采用山锥的几个水平像素样本,并将亮度值与天空中的其他样本进行比较.这适用于区分好图像1和坏图像2.
然而在秋天,它下雪了,山比天空更明亮,就像图像3一样,我的简单亮度测试开始失败.
图4是边缘情况的示例.我认为这是一个很好的形象,因为有些山峰清晰可见.
更新1
谢谢你们的建议 - 我很高兴你们都高估了我的能力.
根据答案,我开始尝试使用ImageMagick边缘检测变换,这使我能够分析更简单的图像.
convert sample.jpg -edge 1 edge.jpg
Run Code Online (Sandbox Code Playgroud)
边缘检测样本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();
Run Code Online (Sandbox Code Playgroud)
我为各种样本图像运行了这个,我得到如下结果(每个样本下面都显示了卷积图像):
(对不起 - 上次不同的样本图片!)
alt text http://www.freeimagehosting.net/uploads/f9a5a34980.jpg
现在我试图量化图像的'ridgy'.我尝试拍摄图像的平均亮度:
$kernel_image->Scale('1x1');
die $kernel_image->GetPixel(x=>1,y=>1)[0];
Run Code Online (Sandbox Code Playgroud)
但是这给出了没有给出有意义的值(0.0165,0.0175和0.0174).有更好的方法吗?
我认为你的工作水平太低了.快速通过边缘检测滤波器将图像集非常清楚地划分为(1,3)和(2,4).特别是如果这些图像来自固定的摄像机视点,则在(1)中找到与原型形状的匹配在算法上将相对容易.即使你的(4)的情况可以给你一个部分匹配的领域,你可以启发式确定是否有足够的山在那里考虑.
一些具体的建议,以你已经拥有的为基础:
ConvolvePerlMagick中的函数(您似乎已经熟悉Perl和ImageMagick)将内核与一些图像进行卷积.在生成的图像上,您应该看到对应于内核"正确"位置的尖锐尖峰(与图像中的山峰重合).| 归档时间: |
|
| 查看次数: |
1090 次 |
| 最近记录: |