# How to define the “lower” and “upper” range of a color?

Hi, could you please help me with a question defining the range of a certain color?

Learning from the question and answers in the site /31305/why-is-this-simple-mask-not-working/

The lines limiting the red are 2 arrays:

lower = n.array([0,100,100])
upper = n.array([20,255,255])


how are these arrays are formed?

The RGB of red is (255, 0, 0) and its HSV is (0°, 100°, 100°)

How’s the RGB 255,0,0 to be relevant into ([0,100,100]) and ([20,255,255])? (reading it BGR shall be 0,0,255)

Thank you.

edit retag close merge delete

the ranges are specific to a colorspace, so for which colorspace is it ?

( 2017-03-16 02:41:01 -0600 )edit

@berak, thank you for the comment. "colorspace" is a new concept to me. Do you mean I need to convert the RGB to colorspace?

( 2017-03-16 02:45:55 -0600 )edit

no, but ranges for BGR are different from ranges for HSV, so you have to be explicit about what you want.

( 2017-03-16 02:51:21 -0600 )edit

@berak, thanks. I just want to know what values to put in the arrays. i.e. how do I know between ([0,100,100]) and ([20,255,255]) is red?

( 2017-03-16 02:54:14 -0600 )edit

in hsv space: [0,100,100] and [20,255,255]

in bgr space: [255 255 0] and [0 0 255]

( 2017-03-16 03:01:57 -0600 )edit

from where can I find the "hsv space" (lower and upper) for all colors?

( 2017-03-16 03:06:52 -0600 )edit

Sort by » oldest newest most voted

from where can I find the "hsv space" (lower and upper) for all colors?

maybe use a "color picker" prog, like this: (it will print out the pixel value, lower and upper bound for each mouseclick)

import cv2
import numpy as np

image_hsv = None   # global ;(
pixel = (20,60,80) # some stupid default

# mouse callback function
def pick_color(event,x,y,flags,param):
if event == cv2.EVENT_LBUTTONDOWN:
pixel = image_hsv[y,x]

#you might want to adjust the ranges(+-10, etc):
upper =  np.array([pixel[0] + 10, pixel[1] + 10, pixel[2] + 40])
lower =  np.array([pixel[0] - 10, pixel[1] - 10, pixel[2] - 40])
print(pixel, lower, upper)

def main():
import sys
global image_hsv, pixel # so we can use it in mouse callback

image_src = cv2.imread(sys.argv[1])  # pick.py my.png
if image_src is None:
print ("the image read is None............")
return
cv2.imshow("bgr",image_src)

## NEW ##
cv2.namedWindow('hsv')
cv2.setMouseCallback('hsv', pick_color)

# now click into the hsv img , and look at values:
image_hsv = cv2.cvtColor(image_src,cv2.COLOR_BGR2HSV)
cv2.imshow("hsv",image_hsv)

cv2.waitKey(0)
cv2.destroyAllWindows()

if __name__=='__main__':
main()

more

@berak, thank you. could you please also give me samples of green and yellow's lower and upper arrays?

( 2017-03-16 03:40:23 -0600 )edit

no i can't (or rather won't)

your green is not my green, you have to use values specific to your situation

( 2017-03-16 04:11:29 -0600 )edit

@berak, thanks again.

( 2017-03-16 04:25:21 -0600 )edit

thank you so much for the solution . This is really helpful!!

( 2018-06-08 02:04:40 -0600 )edit

Thanks a lot for this solution, helped a lot :)

( 2020-09-04 23:03:30 -0600 )edit

Official site

GitHub

Wiki

Documentation

## Stats

Asked: 2017-03-15 22:22:10 -0600

Seen: 42,005 times

Last updated: Mar 16 '17