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:
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.
Probemos esto con la siguiente imagen de prueba simple:
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:
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:
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)
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.
cv2.COLOR_RGBA2BGRA
cv2.imread
con la bandera cv2.IMREAD_UNCHANGED
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)