[PYTHON] Gestion de l'espace colorimétrique HSV inférieur et supérieur dans OpenCV

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.

Qu'est-ce que HSV

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.

スクリーンショット 2017-07-05 21.53.25.png

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

Convertir de RVB en inférieur, supérieur

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.

Déboguer HSV inférieur et supérieur

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.

Ajustez le HSV 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é.

Je ne l'ai pas fait cependant. .. ..

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]]]

référence

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

Gestion de l'espace colorimétrique HSV inférieur et supérieur dans OpenCV
Comment obtenir des histogrammes RVB et HSV avec OpenCV
Implémentation Python du mode de fusion CSS3 et discussion sur l'espace colorimétrique
Gestion des devis en [bash]
Construction d'environnement de python et opencv
Gestion des fichiers JSON en Python
Ouvrez un fichier Excel en Python et coloriez la carte du Japon
Implémentation du filtre à particules par Python et application au modèle d'espace d'états
Python: prétraitement en machine learning: gestion des données manquantes / aberrantes / déséquilibrées
Gestion des codes de caractères des fichiers en IronPython
Captures d'écran de la pêche sur le Web avec du sélénium et Chrome.
Séparation de la conception et des données dans matplotlib
Résumé des modules et des classes dans Python-TensorFlow2-
Importation de modules et gestion des exceptions en python
Projet Euler # 1 "Multiple de 3 et 5" en Python
Extraire la couleur de l'objet dans l'image avec le clustering Mask R-CNN et K-Means