【问题标题】:How can I detect rocks in this image using OpenCV (python)?如何使用 OpenCV(python)检测此图像中的岩石?
【发布时间】:2016-01-28 06:31:46
【问题描述】:

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


(来源:nasa.gov

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

我确实读过关于grabcut的文章,但也没有什么令人满意的。关于我应该如何进行的任何想法?

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

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

import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('image1.JPG',0)
edges = cv2.Canny(img,255,255)

plt.subplot(121),plt.imshow(img,cmap = 'gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(edges,cmap = 'gray')
plt.title('Edge Image'), plt.xticks([]), plt.yticks([])

plt.show()

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


(来源:nasa.gov

【问题讨论】:

  • 我建议您发布一些示例代码来说明您到目前为止所做的事情。这样人们就可以提出修改建议。
  • 我用代码更新了问题。
  • 它很难从色差不大的背景中检测出所有的岩石。和闪电完全不同。但是,如果您假设岩石会比背景暗一点,那么您可以对图像进行阈值化,然后应用轮廓检测​​并检测阈值图像中的轮廓
  • 你能用手动标记的岩石创建另一个图像吗?对我来说,哪些图像部分是岩石,哪些不是,并不是 100%。不要期望实现一种能够检测此类图像中所有岩石的算法,我认为这几乎是不可能的。也许不同类型的传感器会更好(可能是红外摄像机、立体摄像机、激光扫描仪等),但不确定。
  • 不,我没有彩色图像。

标签: python opencv image-processing


【解决方案1】:

岩石是图像中比沙块更平坦的部分。您可以尝试获取文件的每一行,将其分成小段,然后计算段的峰度。

Kurtosis 是对片段中值频率的钟形曲线“高度”和“宽度”的度量。与岩石相比,沙子的峰度要低得多,因为它具有“更广泛”的频率谱。峰度高的段很可能属于岩石。

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

【讨论】:

    【解决方案2】:

    来自 2-d 图片...非常具有挑战性。我敢打赌,使用 2 张带有偏移的图片可以更轻松地将其处理为立体图像。落后于此,我建议以下策略:

    1. 预处理以滤除噪声异常值 - 中值
    2. 也许使用二维带通滤波器来挑选出一定口径的岩石。
    3. 使用您所做的边缘检测 - 似乎做得很好。
    4. 使用可以从顶点中识别聚类的算法
    5. 使用凸包或 voronoi 组合群集中的点或顶点。

    话虽如此,我怀疑这个论坛是否适合寻求您的问题的答案,因为很难使用编码提供直接的答案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2018-05-15
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2017-10-19
      相关资源
      最近更新 更多