【问题标题】:Identifying the range of a color in HSV using openCV使用openCV识别HSV中颜色的范围
【发布时间】:2016-04-23 22:21:53
【问题描述】:

我正在使用 python 中的 openCV 识别黄色。我已经到了这一步,我必须在 HSV 中定义黄色的上下范围。

蓝色范围定义示例:

lower_blue = np.array([110,50,50])
upper_blue = np.array([130,255,255])

HSV 通常以百分比定义,我想知道如何定义黄色的范围,如示例。

This is the colorspaces tutorial I've been following.

编辑: 上面提到的博客中有一些建议,但它没有给我想要的输出。

【问题讨论】:

  • 看看i.stack.imgur.com/gCNJp.jpg。色调值以度数给出。 Opencv 使用范围 0..180 而不是 0..360,因此您必须将度数除以 2。选择目标值周围的任何范围。例如黄色的色调值为 60 度。因此,您的色调范围可能从 60/2 - 10 到 60/2 + 10 或从 60/2-5 到 60/2+5,这取决于您想要远离完美黄色多远。

标签: python opencv


【解决方案1】:

您可以使用此示例调色板。第一个值是上限,第二个值是下限

color_dict_HSV = {'black': [[180, 255, 30], [0, 0, 0]],
              'white': [[180, 18, 255], [0, 0, 231]],
              'red1': [[180, 255, 255], [159, 50, 70]],
              'red2': [[9, 255, 255], [0, 50, 70]],
              'green': [[89, 255, 255], [36, 50, 70]],
              'blue': [[128, 255, 255], [90, 50, 70]],
              'yellow': [[35, 255, 255], [25, 50, 70]],
              'purple': [[158, 255, 255], [129, 50, 70]],
              'orange': [[24, 255, 255], [10, 50, 70]],
              'gray': [[180, 18, 230], [0, 0, 40]]}

【讨论】:

  • 只是,为了帮助大家,这里的 HSV 阵列更有效。像布鲁斯一样,不像其他的那样它真的帮助了我:)
【解决方案2】:

如果我想这样做,首先找到黄色的 rgb 数字(我在油漆中使用“编辑颜色”) 然后使用这种方法将它们更改为 HSV:

 u = np.uint8([[[0,236,236]]])
 # define range of blue color in HSV
 lower_yellow = np.array(cv2.cvtColor(l,cv2.COLOR_BGR2HSV))
 upper_yellow = np.array( cv2.cvtColor(u,cv2.COLOR_BGR2HSV))```

【讨论】:

    【解决方案3】:

    颜色范围

    color_dict_HSV = {'black': [[180, 255, 30], [0, 0, 0]],
                  'white': [[180, 18, 255], [0, 0, 231]],
                  'red1': [[180, 255, 255], [159, 50, 70]],
                  'red2': [[9, 255, 255], [0, 50, 70]],
                  'green': [[89, 255, 255], [36, 50, 70]],
                  'blue': [[128, 255, 255], [90, 50, 70]],
                  'yellow': [[35, 255, 255], [25, 50, 70]],
                  'purple': [[158, 255, 255], [129, 50, 70]],
                  'orange': [[24, 255, 255], [10, 50, 70]],
                  'gray': [[180, 18, 230], [0, 0, 40]]}
    
    

    致谢:

    阿里哈希米安

    如何使用 OPENCV 从图像中去除颜色

    由于大多数人都希望这样做,即在我的情况下,任务是从图像中删除蓝色,我使用以下代码从我的图像中删除蓝色墨水印章和蓝色刻度线,以便使用 Tesseract 进行正确的 OCR。

    [颜色去除]代码

    import cv2
    import numpy as np
    import matplotlib.pyplot as plt
    %matplotlib inline
    
    # image path:    
    #path = "D://opencvImages//"
    #fileName = "out.jpg"
    
    # Reading an image in default mode:
    inputImage = cv2.imread('0.jpg')
    
    # Convert RGB to grayscale:
    grayscaleImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2GRAY)
    
    # Convert the BGR image to HSV:
    hsvImage = cv2.cvtColor(inputImage, cv2.COLOR_BGR2HSV)
    
    # Create the HSV range for the blue ink:
    # [128, 255, 255], [90, 50, 70]
    lowerValues = np.array([90, 50, 70])
    upperValues = np.array([128, 255, 255])
    
    # Get binary mask of the blue ink:
    bluepenMask = cv2.inRange(hsvImage, lowerValues, upperValues)
    # Use a little bit of morphology to clean the mask:
    # Set kernel (structuring element) size:
    kernelSize = 3
    # Set morph operation iterations:
    opIterations = 1
    # Get the structuring element:
    morphKernel = cv2.getStructuringElement(cv2.MORPH_RECT, (kernelSize, kernelSize))
    # Perform closing:
    bluepenMask = cv2.morphologyEx(bluepenMask, cv2.MORPH_CLOSE, morphKernel, None, None, opIterations, cv2.BORDER_REFLECT101)
    
    # Add the white mask to the grayscale image:
    colorMask = cv2.add(grayscaleImage, bluepenMask)
    _, binaryImage = cv2.threshold(colorMask, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    cv2.imwrite('bwimage.jpg',binaryImage)
    thresh, im_bw = cv2.threshold(binaryImage, 210, 230, cv2.THRESH_BINARY)
    kernel = np.ones((1, 1), np.uint8)
    imgfinal = cv2.dilate(im_bw, kernel=kernel, iterations=1)
    cv2.imshow(imgfinal)
    
    

    [原图]之前

    蓝标提取

    最终图像

    在这里你可以看到几乎所有的刻度线都被删除了,原因是因为总是有改进的余地,但这似乎是我们能得到的最好的,因为即使删除这些小标记也不是将对使用 Tesseract 的 OCR 产生深远影响。

    希望有所帮助!

    【讨论】:

      【解决方案4】:

      如果您使用相机拍照,则取决于照明条件。如果您的目标是跟踪某些对象,则应始终更新 HSV 值。我的建议是在您的照明条件下使您的边界尽可能窄。

      【讨论】:

        【解决方案5】:

        简单。您可以使用函数cv2.cvtColor()

        您只需传递要转换为 hsv 的 BGR 值,而不是传递图像。

        例如,要查找 Green 的 HSV 值,请键入以下命令

        import numpy as np
        import cv2
        
        green = np.uint8([[[0, 255, 0]]]) #here insert the bgr values which you want to convert to hsv
        hsvGreen = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
        print(hsvGreen)
        
        lowerLimit = hsvGreen[0][0][0] - 10, 100, 100
        upperLimit = hsvGreen[0][0][0] + 10, 255, 255
        
        print(upperLimit)
        print(lowerLimit)
        

        现在,上限将是[H+10, 100,100]

        下限为[H-10, 255, 255]

        官方文档(见以下网页最后部分)https://docs.opencv.org/3.1.0/df/d9d/tutorial_py_colorspaces.html

        【讨论】:

          【解决方案6】:

          看看this page你会找到你想要的颜色的HSV值。

          对于 HSV,色调范围为 [0,179],饱和度范围为 [0,255],值范围为 [0,255]。不同的软件使用不同的尺度。因此,如果您将 OpenCV 值与它们进行比较,则需要对这些范围进行归一化。

          我猜你正在搜索下面的黄色值

          lower_blue = np.array([25,50,50])
          upper_blue = np.array([32,255,255])
          

          【讨论】:

          • 是的,我正在为黄色寻找这样的值。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-03
          • 2014-06-19
          • 2011-12-09
          相关资源
          最近更新 更多