L'avantage de HSV est que vous pouvez sélectionner la couleur avec le bas et le haut, mais j'ai eu du mal car le bas et le haut pour la couleur sont inconnus, alors prenez note.
C'est comme une extension de RVB, et il se compose de teinte, de saturation et de légèreté. Ce qui me fait plaisir, c'est qu'il est facile de spécifier la gamme de couleurs. La partie H correspond à la partie rgb.
Gamme de teinte de type 0-360 Saturation-éclat des couleurs dans la plage de 0 à 100%. Luminosité-Luminosité des couleurs dans la plage de 0 à 100%.
Il semble que la valeur définie dans est différente selon le logiciel. Avec opencv, je pense que la luminosité est comprise entre 100 et 255.
Voir le wiki https://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93
simulateur http://www.rapidtables.com/convert/color/hsv-to-rgb.htm
convert.py
import sys
import numpy as np
import cv2
#rgb
red = sys.argv[1]
green = sys.argv[2]
blue = sys.argv[3]
color = np.uint8([[[blue, green, red]]])
hsv_color = cv2.cvtColor(color, cv2.COLOR_BGR2HSV)
hue = hsv_color[0][0][0]
print("Lower bound is :"),
print("[" + str(hue-10) + ", 100, 100]\n")
print("Upper bound is :"),
print("[" + str(hue + 10) + ", 255, 255]")
python convert.py 255 255 255
Je le convertis comme ça, mais celui-ci ne peut être converti qu'en gros.
hsv.py
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)
image_mask = cv2.inRange(image_hsv,lower,upper)
cv2.imshow("mask",image_mask)
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()
python hsv.py hoge.png
Il est masqué au démarrage et double-cliqué sur l'écran hsv. Par exemple, le jaune et le vert sont très similaires. Rose et rouge aussi. Dans ce cas, même si vous cliquez sur rose, le rouge réagit également. En d'autres termes, vous devez affiner la profondeur et la luminosité des couleurs. Je ne savais pas comment le faire automatiquement, alors j'ai joué avec manuellement.
hsv_sample.py
import sys
import cv2
import numpy as np
import sys
import cv2
import numpy as np
#yellow
# lower = np.array([30,100,250])
# upper = np.array([40,255,255])
#pink
lower = np.array([160,50,50])
upper = np.array([180,255,255])
#yellowgreen
# lower = np.array([30,100,200])
# upper = np.array([60,255,250])
image_src = cv2.imread(sys.argv[1])
image_src = cv2.cvtColor(image_src,cv2.COLOR_BGR2HSV)
image_src = cv2.inRange(image_src,lower,upper)
while True:
cv2.imshow("image_src",image_src)
if cv2.waitKey(10) == 27: # ESC
break
Une méthode très primitive, mais un masque jaune-vert, très similaire au jaune, a également fonctionné.
Pour cette raison, il a peut-être été possible de l'automatiser en l'affichant et en spécifiant la plage de chot.
python
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
How to define the “lower” and “upper” range of a color? http://answers.opencv.org/question/134248/how-to-define-the-lower-and-upper-range-of-a-color/ http://docs.opencv.org/trunk/df/d9d/tutorial_py_colorspaces.html
Recommended Posts