How to detect two different colors using `cv2.inRange` in Python-OpenCV?

后端 未结 3 1135
旧时难觅i
旧时难觅i 2020-11-27 06:06

How can I define \"lower\" and \"upper\" range of two different color, such as red and blue (because red and blue are not next to each other in the HSV color)

This o

相关标签:
3条回答
  • 2020-11-27 06:43

    As you get two masks of colors, then use cv2.bitwise_or to get the final mask.

    import cv2
    
    ## Read
    img = cv2.imread("sunflower.jpg")
    
    ## convert to hsv
    hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
    
    ## mask of green (36,0,0) ~ (70, 255,255)
    mask1 = cv2.inRange(hsv, (36, 0, 0), (70, 255,255))
    
    ## mask o yellow (15,0,0) ~ (36, 255, 255)
    mask2 = cv2.inRange(hsv, (15,0,0), (36, 255, 255))
    
    ## final mask and masked
    mask = cv2.bitwise_or(mask1, mask2)
    target = cv2.bitwise_and(img,img, mask=mask)
    
    cv2.imwrite("target.png", target)
    

    Source:

    Find green and yellow(the range is not that accurate):


    BTW, to get more accurate range, here is a refer map in my related answer:

    How to define a threshold value to detect only green colour objects in an image :Opencv

    0 讨论(0)
  • 2020-11-27 06:46

    The below image shows the HSV Colour space, which works using Hue, Saturation & Value (or lightness).

    When working in the HSV colour space it is important to remember this and that concepts such as Red & Green are a sort-of conversion back to a different data type.

    Your upper and lower boundaries can therefore only be one point in this space but can include parts of the red and blue spectrum's, i.e. purple. You would need to select threshold values that meet the criteria of whatever processing output you need.

    Either that or run two separate loops, the first to threshold out the Red, and the second to threshold out your blue and then blend the two images together using OpenCV Blend functions. See here for blending two colour spaces.

    0 讨论(0)
  • 2020-11-27 06:48
    # Make a copy of the image
    
    image_copy = np.copy(image)
    ## TODO: Define the color selection boundaries in RGB values
    # play around with these values until you isolate the blue background
    
    lower_blue = np.array([200,0,0]) 
    upper_blue = np.array([250,250,255])
    
    # Define the masked area
    
    mask = cv2.inRange(image_copy, lower_blue, upper_blue)
    # Vizualize the mask
    
    plt.imshow(mask,cmap='gray')
    
    0 讨论(0)
提交回复
热议问题