Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

971
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

over 4 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
over 4 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)
over 4 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 Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda