【问题标题】:Draw contours around images of the same color with openCV python使用openCV python在相同颜色的图像周围绘制轮廓
【发布时间】:2021-02-01 05:38:06
【问题描述】:

我有这张带有 3 通道 RGB 的图像(VARI 索引计算的结果),我想在植物周围绘制边界框(矩形),这里用绿色表示。使用 OpenCV / python 最好和最简单的方法是什么?

我想这对于 OpenCV 专家来说是一个简单的问题,但我在网上找不到很好的教程来为多个对象执行此操作。

我找到的最接近的教程是: determining-object-color-with-opencv

边界框的假设应该/可以是:

  • 绿色是主要颜色。
  • 应该大于 X 像素。

提前致谢!

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    偶然发现此资源后回答我自己的问题:https://docs.opencv.org/3.4/da/d0c/tutorial_bounding_rects_circles.html

    可能不是最好的答案,但它以某种方式解决了我的问题!

    import cv2
    import numpy as np
    
    image = cv2.imread('vari3.png')
    
    # https://www.pyimagesearch.com/2016/02/15/determining-object-color-with-opencv/
    # https://docs.opencv.org/3.4/da/d0c/tutorial_bounding_rects_circles.html
    
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    lab = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)
    
    # mask: green is dominant.
    thresh = np.array((image.argmax(axis=-1) == 1) * 255, dtype=np.uint8)
    
    cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0]
    
    contours_poly = [None] * len(cnts)
    boundRect = [None] * len(cnts)
    for i, c in enumerate(cnts):
        contours_poly[i] = cv2.approxPolyDP(c, 3, True)
        boundRect[i] = cv2.boundingRect(contours_poly[i])
    
    for i in range(len(cnts)):
        # cv2.drawContours(image, contours_poly, i, (0, 255, 0), thickness=2)
        pt1 = (int(boundRect[i][0]), int(boundRect[i][1]))
        pt2 = (int(boundRect[i][0] + boundRect[i][2]), int(boundRect[i][1] + boundRect[i][3]))
        if np.sqrt((pt2[1] - pt1[1]) * (pt2[0] - pt1[0])) < 30:
            continue
        cv2.rectangle(image, pt1, pt2, (0, 0, 0), 2)
    
    cv2.imwrite('result.png', image)
    cv2.imshow("Image", image)
    cv2.waitKey(0)
    

    【讨论】:

      【解决方案2】:

      你需要做 HSV 过滤

      1. 将图像颜色从 BGR 更改为 HSV(色相饱和度值)。
      2. 过滤与绿色匹配的特定范围的饱和度和色调 阈值。

      请参阅此页面以获取执行前 2 项的代码

      https://pythonprogramming.net/color-filter-python-opencv-tutorial/

      1. 做一些形态学操作,比如腐蚀、膨胀、开孔、 关闭以删除不代表树木的小块绿色 并将看起来破碎的树木连接在一起。

      参考https://docs.opencv.org/master/d9/d61/tutorial_py_morphological_ops.html

      1. 检测轮廓然后绘制矩形
      import cv2
      import numpy as np
      
      img = cv2.imread('8FGo1.jpg',1)
      
      hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
      lower_red = np.array([45,100,50])
      upper_red = np.array([75,255,255])
          
      mask = cv2.inRange(hsv, lower_red, upper_red)
      
      kernel = np.ones((5,5),np.uint8)
      mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
      mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel)
      
      
      contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
      
      
      for contour in contours:
          x,y,w,h = cv2.boundingRect(contour)
          img = cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
          cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)
      
      
      cv2.imshow('img',img)
      #cv2.imshow('mask',mask)
      

      输出

      【讨论】:

      • 感谢您的回答!我在“大”边界框内得到了很多小边界框。
      • 我已经通过使用 cv2.RETR_EXTERNAL 检查新代码来解决这个问题
      • 嗯,我还是这样
      猜你喜欢
      • 2012-11-06
      • 2019-11-04
      • 2019-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-02-13
      • 2019-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多