Solución:
Estoy promocionando mi comentario a una respuesta:
La forma fácil es:
Podrías dibujar en el ‘marco’ original en sí mismo en lugar de usar una imagen gris.
La manera difícil (método que estaba tratando de implementar):
backtorgb = cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB)
es la sintaxis correcta.
Prueba esto:
import cv2
import cv
color_img = cv2.cvtColor(gray_img, cv.CV_GRAY2RGB)
Descubrí, mientras usaba opencv, que algunas de las constantes están definidas en el módulo cv2 y otras en el módulo cv.
Alternativamente, cv2.merge()
se puede utilizar para convertir una capa de máscara binaria de un solo canal en una imagen de color de tres canales fusionando la misma capa como las capas azul, verde y roja de la nueva imagen. Pasamos una lista de las tres capas de canales de color, todas iguales en este caso, y la función devuelve una sola imagen con esos canales de color. Esto transforma eficazmente una imagen de forma en escala de grises. (height, width, 1)
dentro (height, width, 3)
Para abordar su problema
Hice algunos umbrales en una imagen y quiero etiquetar los contornos en verde, pero no se muestran en verde porque mi imagen está en blanco y negro.
Esto se debe a que está intentando mostrar tres canales en una imagen de un solo canal. Para solucionar esto, simplemente puede fusionar los tres canales individuales
image = cv2.imread('image.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray_three = cv2.merge([gray,gray,gray])
Ejemplo
Creamos una imagen en color con dimensiones (200,200,3)
image = (np.random.standard_normal([200,200,3]) * 255).astype(np.uint8)
A continuación, lo convertimos a escala de grises y creamos otra imagen usando cv2.merge()
con tres canales grises
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
gray_three = cv2.merge([gray,gray,gray])
Ahora dibujamos un contorno relleno en la imagen en escala de grises de un solo canal (izquierda) con forma (200,200,1)
y la imagen en escala de grises de tres canales con forma (200,200,3)
(Derecha). La imagen de la izquierda muestra el problema que está experimentando, ya que está intentando mostrar tres canales en una imagen de un solo canal. Después de fusionar la imagen en escala de grises en tres canales, ahora podemos aplicar color a la imagen
contour = np.array([[10,10], [190, 10], [190, 80], [10, 80]])
cv2.fillPoly(gray, [contour], [36,255,12])
cv2.fillPoly(gray_three, [contour], [36,255,12])
Código completo
import cv2
import numpy as np
# Create random color image
image = (np.random.standard_normal([200,200,3]) * 255).astype(np.uint8)
# Convert to grayscale (1 channel)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# Merge channels to create color image (3 channels)
gray_three = cv2.merge([gray,gray,gray])
# Fill a contour on both the single channel and three channel image
contour = np.array([[10,10], [190, 10], [190, 80], [10, 80]])
cv2.fillPoly(gray, [contour], [36,255,12])
cv2.fillPoly(gray_three, [contour], [36,255,12])
cv2.imshow('image', image)
cv2.imshow('gray', gray)
cv2.imshow('gray_three', gray_three)
cv2.waitKey()