python - 如何在SimpleCV或opencv中计算边界内的标记区域

标签 python opencv image-processing simplecv opencv-contour

我有这张图片:

在这里,我有一张绿色背景上的图像,其中有一个用红线标记的区域。我想相对于图像计算标记部分的面积。

我正在裁剪图像以去除绿色背景并计算裁剪后的图像的面积。从这里我不知道如何进行。

我注意到Contour可以用于此,但是问题是在这种情况下如何绘制轮廓。

我想如果我可以创建轮廓并用某种颜色填充标记的区域,则可以从整个(裁剪的)图像中减去它,并获得两个区域。

最佳答案

在您的链接中,他们将threshold方法与参数中的颜色一起使用。基本上,它将源图像获取,并将所有大于此值的像素设置为白色,否则将其设置为黑色(这意味着您的源图像需要是灰度图像)。此阈值使您可以“填充标记区域”,以便进行轮廓检测。

但是,我认为您应该尝试在裁剪后的图片上使用inRange方法。它与threshold几乎相同,但是没有一个阈值,而是有一个最小和最大边界。如果像素在边界给定的颜色范围内,则它将设置为白色。如果不是,则将其设置为黑色。我不知道这是否行得通,但是,如果您尝试隔离范围内的“最绿色”颜色,则可能会在右上方显示大的白色区域。

然后,在二值化图像上应用findContours方法。它会为您提供找到的所有轮廓,因此,如果图像中其他位置上有小的白点也没关系,则只需选择该方法找到的最大轮廓。

请注意,如果inRange的范围不合适,则您应该在右上角找到的白色大区域可能包含一些噪音,并且可能会干扰轮廓检测。为避免这种情况,您可以使图像模糊,并进行侵 eclipse /膨胀之类的处理。这样,您可能会得到更好的检测。

编辑

我将在此处添加一些代码,但不能按原样使用。就像我说的那样,我对Python一无所知,所以我在这里所能做的就是为您提供带有提供参数的OpenCV方法。

让我们还回顾一下步骤:

  • 使用inRange对图像进行二值化。您需要为最小和最大边界找到合适的值。您要在此处进行的操作是隔离绿色,因为它主要是轮廓内部的区域。我真的不能建议您比试错更好的方法来找到最佳阈值。让我们从最小和最大值开始:(0,125,0)和(255,250,255)
  • inRange(source_image, Scalar(0, 125, 0), Scalar(255, 250, 255), binarized_image)
  • 使用imshow检查结果
  • imshow("bin", binarized_image)
  • 如果您可以进行二值化(可以很好地检测到想要的区域),请应用findContours。抱歉,我不理解您的教程或文档中使用的语法,但是这里有一些参数:
  • binarized_mat:您的二值化图像
  • contours:Point数组的数组,其中将包含检测到的所有轮廓。每个轮廓都存储为点数组。
  • mode:您可以选择所需的任何内容,但是我建议您使用RETR_EXTERNAL。
  • 获取最大大小的数组,因为它可能是点数最多的轮廓(然后是最大的轮廓)。
  • 计算
  • 内的面积

    希望这可以帮助!

    关于python - 如何在SimpleCV或opencv中计算边界内的标记区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41036165/

    相关文章:

    python - 向 asyncio Transport 添加方法

    python - OpenCV 图像处理以在 Python 中裁剪图像的倾斜部分

    image-processing - OpenCV:立体声校正问题(使用书中的示例代码)

    android - 如何获取 Instagram 个人资料图片

    python - 如何使彩色图像的光线均匀?

    用于树结构的类似 Python numpy 的接口(interface)

    python - ListProperty 与 GoogleAppEngine

    python - 我想将数据框转换为列表列表,其中包含第一个列表中的列名和其他列表中的数据

    opencv - 什么是 Sobel 算子的命令?

    c++ - 使用 Opencv 从 Macbook Pro iSight 捕获