2010-09-27 49 views
20

我一直在嘗試使用透明通道(RGB和Alph)加載.png文件,但沒有運氣。看起來,openCV將第4個通道從圖像中剝離出來。是否有任何方法可以加載包含Alpha通道的完整4通道的圖像,即使我必須修改OpenCV源代碼並重新構建該圖像OpenCV:如何使用4個通道加載png圖像?

回答

1

顯然,OpenCV仍然不支持帶Alpha通道的PNG。

還有hacks to bypass這個。

+2

@karlphilip:這不是真的了。也許刪除/編輯你的答案。請參閱此處的示例:https://stackoverflow.com/questions/23562207/image-change-the-shape-when-displaying#23562497 – 2014-05-09 10:48:54

10

根據documentation,OpenCV支持PNG上的alpha通道。

就叫使用CV_LOAD_IMAGE_UNCHANGED作爲這樣的標誌的imread功能:

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

根據此回覆中的鏈接[閱讀和寫作圖像和視頻](http:///docs.opencv.org/2.4/modules/highgui/doc/reading_and_writing_images_and_video.html),只需將負數作爲標誌。在'/ usr/include/opencv2/highgui/highgui_c.h'中沒有提到'CV_LOAD_IMAGE_UNCHANGED',但它確實在Ubuntu 14.04的股票OpenCV包中有效。 – 2015-11-02 16:09:52

28

如果您正在使用OpenCV的2或3的OpenCV你應該使用IMREAD_ *標誌(截至here提到)。

C++

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)沒有提到那些命名常量。 – 2015-11-02 16:12:27

+2

我大概是通過閱讀源代碼:) – 2016-01-13 18:52:28

3

讀取透明PNG正確的方法是使用第四通道作爲alpha通道。大部分時間想要白色背景,如果是這種情況,那麼下面的代碼可以用於alpha合成。

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

相關問題