2010-09-27 20 views
20

He intentado cargar archivos .png con canal de transparencia (RGB y Alph) sin suerte. Parece que openCV elimina el cuarto canal de la imagen. ¿Hay algún método para cargar la imagen con los 4 canales completos incluyendo el canal alfa incluso si tuve que modificar el código fuente de OpenCV y reconstruirloOpenCV: cómo cargar imágenes png con 4 canales?

Respuesta

1

Aparentemente, OpenCV aún no admite PNG con canal Alpha.

Hay hacks to bypass esto.

+2

@karlphilip: esto ya no es cierto. Tal vez eliminar/editar tu respuesta. Véase, por ejemplo, aquí: https://stackoverflow.com/questions/23562207/image-change-the-shape-when-displaying#23562497 –

10

De acuerdo con documentation, OpenCV admite canal alfa en PNG.

Sólo tiene que llamar a la función imread usando CV_LOAD_IMAGE_UNCHANGED como banderas de este tipo:

cvLoadImage("file.png", CV_LOAD_IMAGE_UNCHANGED) 
+0

De acuerdo con el enlace en esta respuesta [Reading and Writing Images and Video] (http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html), solo pon un número negativo como flag. No se menciona 'CV_LOAD_IMAGE_UNCHANGED' pero de hecho se define en'/usr/include/opencv2/highgui/highgui_c.h' y funciona en el paquete OpenCV de Ubuntu 14.04. –

28

Si está usando OpenCV OpenCV 2 o 3 usted debe utilizar IMREAD_ * banderas (como se mencionó al here).

C++

using namespace cv; 
Mat image = imread("image.png", IMREAD_UNCHANGED); 

Python

import cv2 
im = cv2.imread("image.png", cv2.IMREAD_UNCHANGED) 
+0

Extraño que [Leer y escribir imágenes y videos] (http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html) no menciona esas constantes con nombre. –

+2

Probablemente lo obtuve leyendo el código fuente :) –

3

La forma correcta de leer un PNG transparente es usar el cuarto canal como canal alfa. La mayoría de las veces uno quiere un fondo blanco, si ese es el caso, entonces el código siguiente puede usarse para la composición alfa.

def read_transparent_png(filename): 
    image_4channel = cv2.imread(filename, cv2.IMREAD_UNCHANGED) 
    alpha_channel = image_4channel[:,:,3] 
    rgb_channels = image_4channel[:,:,:3] 

    # White Background Image 
    white_background_image = np.ones_like(rgb_channels, dtype=np.uint8) * 255 

    # Alpha factor 
    alpha_factor = alpha_channel[:,:,np.newaxis].astype(np.float32)/255.0 
    alpha_factor = np.concatenate((alpha_factor,alpha_factor,alpha_factor), axis=2) 

    # Transparent Image Rendered on White Background 
    base = rgb_channels.astype(np.float32) * alpha_factor 
    white = white_background_image.astype(np.float32) * (1 - alpha_factor) 
    final_image = base + white 
    return final_image.astype(np.uint8) 

Un blog detallado sobre esto está aquí here.

Cuestiones relacionadas