Saltar al contenido

¿Cómo se convierte una imagen en escala de grises a RGB en OpenCV (Python)?

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)

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí
ingrese la descripción de la imagen aquí

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()
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *