2010-09-27 14 views
20

Próbowałem wczytać pliki .png z przezroczystym kanałem (RGB i Alph) bez powodzenia. Wygląda na to, że openCV usuwa czwarty kanał z obrazu. Czy jest jakikolwiek sposób załadowania obrazu za pomocą kompletu 4 kanałów, w tym kanału alfa, nawet gdybym musiał zmodyfikować kod źródłowy OpenCV i odbudować goOpenCV: Jak ładować obrazy PNG 4 kanałami?

Odpowiedz

1

Wygląda na to, że OpenCV nadal nie obsługuje plików PNG z kanałem alfa.

Jest to hacks to bypass to.

+2

@karlphilip: to już nie jest prawda. Może usuń/edytuj swoją odpowiedź. Zobacz na przykład tutaj: https://stackoverflow.com/questions/23562207/image-change-the-shape-when-displaying#23562497 –

10

Zgodnie z documentation, OpenCV obsługuje kanał alfa na PNG.

Wystarczy wywołać funkcję imread korzystając CV_LOAD_IMAGE_UNCHANGED jak flagi tak:

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

Zgodnie z linkiem w tej odpowiedzi [Czytanie i pisanie obrazów i wideo] (http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html), po prostu wpisz liczbę ujemną jako flagę. Nie wspomniano o 'CV_LOAD_IMAGE_UNCHANGED', ale w rzeczywistości jest ono zdefiniowane w'/usr/include/opencv2/highgui/highgui_c.h' i działa na pakiecie OpenCV w systemie Ubuntu 14.04. –

28

Jeśli używasz OpenCV 2 lub OpenCV 3 należy użyć IMREAD_ * flagi (jak wspomniano w here).

C++

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

Python

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

Dziwne, że [czytanie i pisanie obrazów i wideo] (http://docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html) nie wspomina o nazwanych stałych. –

+2

Prawdopodobnie dostałem to czytając kod źródłowy :) –

3

Prawo sposób odczytać przezroczysty PNG jest użycie 4th kanał jako kanał alfa. Najczęściej chce się mieć białe tło, jeśli tak jest, to poniżej można użyć kodu do komponowania alfą.

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) 

Szczegółowy blog na ten temat znajduje się tutaj here.

Powiązane problemy