• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
    • Preguntas
    • Profesores
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Pruebas Online
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

709
Vistas
¿Por qué cv2.imwrite() cambia el color de las fotos?

Tengo el siguiente fragmento de código:

 imgs = glob.glob('/home/chipin/heart/tray.png') current_img = io.imread(imgs[0]) cv2.imwrite('/home/chipin/heart/01.png', current_img[0:511,0:511])

El tamaño de la imagen es 512*512, después de guardarla, una imagen azul se vuelve amarilla. Parece que un canal está abandonado. Realmente no sé por qué.

Aquí está el valor de current_img:

valor de current_img

about 3 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Su problema es que skimage.io.imread carga la imagen como RGB (o RGBA), pero OpenCV asume que la imagen es BGR o BGRA (BGR es el formato de color predeterminado de OpenCV). Esto significa que los aviones azul y rojo se voltean.


Imágenes de 3 canales

Probemos esto con la siguiente imagen de prueba simple:

Imagen de entrada


Primero probemos tu algoritmo original:

 import skimage.io import cv2 img = skimage.io.imread('sample.png') cv2.imwrite('sample_out_1.png', img)

Obtenemos el siguiente resultado:

resultado 1

Como puede ver, los canales rojo y azul están visiblemente intercambiados.


El primer enfoque, suponiendo que aún desea usar skimage para leer y cv2 para escribir, es usar cv2.cvtColor para convertir de RGB a BGR.

Dado que los nuevos documentos de OpenCV no mencionan la sintaxis de Python, en este caso también puede usar la referencia adecuada para 2.4.x.

 import skimage.io import cv2 img = skimage.io.imread('sample.png') cv2.imwrite('sample_out_2.png', cv2.cvtColor(img, cv2.COLOR_RGB2BGR))

Ahora obtenemos la siguiente salida:

resultado 2


Una alternativa es simplemente usar OpenCV: use cv2.imread para cargar la imagen. En este caso estamos trabajando solo con imágenes BGR.

NB: No proporcionar ninguna bandera significa que cv2.IMREAD_COLOR se usa de forma predeterminada, es decir, la imagen siempre se carga como una imagen de 3 canales (eliminando cualquier canal alfa potencial).

 import cv2 img = cv2.imread('sample.png') cv2.imwrite('sample_out_3.png', img)

resultado 3


Imágenes de 4 canales

De su captura de pantalla, parece que tiene una imagen de 4 canales. Esto significaría RGBA en skimage y BGRA en OpenCV. Los principios serían similares.

  • Utilice el código de conversión de color cv2.COLOR_RGBA2BGRA
  • O use cv2.imread con la bandera cv2.IMREAD_UNCHANGED
about 3 years ago · Santiago Trujillo Denunciar

0

La imagen en la entrada (como png) está en orden RGB, pero la imagen en la memoria (como cv::Mat) está en orden BGR. Utilice cv2.imread() para la entrada. Entonces, imread() se convertirá internamente de rgb a bgr e imwrite() hará lo contrario, todo bajo el capó.

Así es como lo haces:

 current_img = cv2.imread('/home/chipin/heart/tray.png') cv2.imwrite('/home/chipin/heart/01.png', current_img)
about 3 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda