2010-09-27 2 views
20

Я пытаюсь загрузить файлы .png с каналом прозрачности (RGB и Alph) без везения. Похоже, что openCV удаляет 4-й канал из изображения. Есть ли способ загрузить изображение с помощью 4-х каналов, включая альфа-канал, даже если мне пришлось изменить исходный код OpenCV и восстановить его.OpenCV: Как загрузить PNG-изображения с 4-мя каналами?

ответ

1

По-видимому, OpenCV по-прежнему не поддерживает PNG с альфа-каналом.

hacks to bypass это.

+2

@karlphilip: это больше не так. Возможно, удалите/отредактируйте ответ. См. Здесь: https://stackoverflow.com/questions/23562207/image-change-the-shape-when-displaying#23562497 –

10

Согласно documentation, OpenCV поддерживает альфа-канал в PNG.

Просто вызовите функцию imread используя CV_LOAD_IMAGE_UNCHANGED как флаги, как это:

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

Согласно ссылке в этом ответе [Чтение и запись изображений и видео] (http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html), просто поместите отрицательное число как флаг. Никакой 'CV_LOAD_IMAGE_UNCHANGED' не упоминается, но действительно он определен в'/usr/include/opencv2/highgui/highgui_c.h', и он работает с открытым пакетом OpenCV Ubuntu 14.04. –

28

Если вы используете OpenCV 2 или 3 OpenCV следует использовать IMREAD_ * флаги (как указано в here).

С ++

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

Python

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

Странно, что [чтение и запись изображений и видео] (http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html) не упоминает эти именованные константы. –

+2

Я, наверное, понял это, прочитав исходный код :) –

3

Правильный путь для чтения прозрачный PNG является использование 4-го канала в качестве альфа-канала. В большинстве случаев вам нужен белый фон, если это так, то ниже код может использоваться для альфа-компоновки.

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) 

Детальный блог здесь here.

Смежные вопросы