如何使用OpenCV(python)检测此图像中的岩石?

时间:2016-01-28 06:31:47

标签: python opencv image-processing

我试图在这张图片中找到不同形状的岩石。

image http://mars.nasa.gov/mer/gallery/all/2/n/1850/2N290598950EDNB0F8F0006L0M1.JPG

我没有从边缘检测中获得任何令人满意的结果。

enter image description here

我确实读到了关于抓取的但是再也没有令人满意的。关于我应该如何进行的任何想法?

PS - 我的最终目标是用不同的颜色在图像中标记这些岩石。

更新1: 这是我用于边缘检测的代码。

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0)
    {
        [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]];
        [[UIApplication sharedApplication] registerForRemoteNotifications];
    }
    else
    {
        [[UIApplication sharedApplication] registerForRemoteNotificationTypes:
         (UIUserNotificationTypeBadge | UIUserNotificationTypeSound | UIUserNotificationTypeAlert)];
    }

更新2:我有几个类似的图像,如下图所示,其中岩石(大尺寸)清晰可见。边缘检测再次在图像上产生不令人满意的结果。我只是在寻找可以尝试的方法。如果您建议一种方法,那么请添加相关链接,我可以阅读更多内容,我是opencv的新手。

http://mars.nasa.gov/mer/gallery/all/2/p/2190/2P320875706EFFB27MP2400L5M5-BR.JPG

2 个答案:

答案 0 :(得分:2)

岩石是图像的一部分,比沙子更平坦。您可以尝试获取文件的每一行,将其划分为小段,并计算段的峰度。

Kurtosis衡量"身高"和"宽度"段中值的频率的钟形曲线。沙子将比岩石具有显着更低的峰度,因为它具有更宽的"频谱。具有高峰度的区段可能属于岩石。

因此,确定图像的每一行必须分成的段的理想长度是一个问题。这不是一项微不足道的任务,但也不是一项艰巨的任务。你要识别的最小岩石宽度的一半(但至少是一粒沙子宽度的100倍)应该可以解决问题。

答案 1 :(得分:0)

从二维照片......真的很有挑战性。我打赌使用2张带偏移的图片是如何做得更容易处理为立体图像。滞后,我建议遵循以下策略:

  1. 过滤掉噪声异常值的预处理 - 中位数
  2. 也许使用2-d带通过滤器来挑选出某种口径的岩石。
  3. 使用您所做的边缘检测 - 似乎做得非常出色。
  4. 使用可识别顶点群集的算法
  5. 使用凸包或voronoi组合群集中的点或顶点。
  6. 话虽如此,我怀疑这个论坛是否适合寻找你的问题的答案,因为很难用编码提供直截了当的答案。