yellow segmentation raspberry por objetos how detectar deteccion con colores color clasificacion python opencv colors

raspberry - image segmentation python



¿Cómo encontrar las regiones de color ROJO con OpenCV? (4)

Estoy tratando de hacer un programa donde detecto rojo. Sin embargo, a veces es más oscuro de lo habitual, por lo que no puedo usar un solo valor. ¿Cuál es un buen rango para detectar diferentes tonos de rojo? Actualmente estoy usando el rango 128, 0, 0 - 255, 60, 60 pero a veces ni siquiera detecta un objeto rojo que puse delante de él.


Color rojo significa que el valor rojo es más alto que el azul y el verde.

Para que pueda verificar las diferencias entre rojo y azul, rojo y verde.

Simplemente puede dividir RGB en canales individuales y aplicar un umbral como este.

b,g,r = cv2.split(img_rgb) rg = r - g rb = r - b rg = np.clip(rg, 0, 255) rb = np.clip(rb, 0, 255) mask1 = cv2.inRange(rg, 50, 255) mask2 = cv2.inRange(rb, 50, 255) mask = cv2.bitwise_and(mask1, mask2)

Espero que pueda ser una solución para su problema.

Gracias.


Puede verificar que el componente rojo sea el máximo y que otros sean claramente inferiores:

def red(r, g, b): threshold = max(r, g, b) return ( threshold > 8 # stay away from black and r == threshold # red is biggest component and g < threshold*0.5 # green is much smaller and b < threshold*0.5 # so is b )

Esto se puede implementar de manera muy eficiente usando numpy.

La "forma correcta" sería hacer una conversión completa a HSV y verificar allí, pero será más lento y algo más complicado (el tono es un ángulo, por lo que no puede simplemente tomar el valor absoluto de la diferencia, además colores como (255, 254 , 254) serán calificados como "rojos" incluso si se consideran blancos para un humano).

Tenga en cuenta también que el sistema visual humano tiende a compensar el promedio, por lo que algo podría verse como "azul", incluso si el componente más grande es rojo, pero todo en la imagen es rojo, por lo que "no cuenta" para nuestro cerebro.

En la imagen a continuación, si le pregunta a un humano de qué color es la parte del área del círculo, la mayoría diría "azul", mientras que el componente más grande es el rojo:


Utilice HSV o HSL (matiz, saturación, luminancia) en lugar de RGB, en HSV el color rojo se puede detectar fácilmente utilizando el valor del hue dentro de cierto umbral.


RGB no es un buen espacio de color para la detección de color específica. HSV será una buena opción.

Para RED, puede elegir el rango HSV (0,50,20) ~ (5,255,255) y (175,50,20)~(180,255,255) utilizando el siguiente mapa de colores. Por supuesto, el RED range no es tan preciso, pero está bien.

El código tomado de mi otra respuesta: detectar si un píxel es rojo o no

#!/usr/bin/python3 # 2018.07.08 10:39:15 CST # 2018.07.08 11:09:44 CST import cv2 import numpy as np ## Read and merge img = cv2.imread("ColorChecker.png") img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) ## Gen lower mask (0-5) and upper mask (175-180) of RED mask1 = cv2.inRange(img_hsv, (0,50,20), (5,255,255)) mask2 = cv2.inRange(img_hsv, (175,50,20), (180,255,255)) ## Merge the mask and crop the red regions mask = cv2.bitwise_or(mask1, mask2 ) croped = cv2.bitwise_and(img, img, mask=mask) ## Display cv2.imshow("mask", mask) cv2.imshow("croped", croped) cv2.waitKey()

Respuestas relacionadas:

  1. Elección de los límites de HSV superiores e inferiores correctos para la detección de color con `cv :: inRange` (OpenCV)
  2. Cómo definir un valor umbral para detectar solo objetos de color verde en una imagen: Opencv
  3. ¿Cómo detectar dos colores diferentes usando `cv2.inRange` en Python-OpenCV?
  4. Detecta si un píxel es rojo o no

Por supuesto, para la pregunta específica, quizás otro espacio de color también esté bien.

¿Cómo leer la aguja del medidor de utilidad con opencv?