Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

970
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!