opencv 如何用4个通道加载png图像?

b1zrtrql  于 2023-01-17  发布在  其他
关注(0)|答案(7)|浏览(422)

我一直试图加载.png文件的透明度通道(RGB和阿尔法)没有运气。它似乎是openCV剥离了第4通道的图像。有没有任何方法来加载图像与完整的4个通道,包括阿尔法通道,即使我不得不修改OpenCV源代码和重建它?

tgabmvqs

tgabmvqs1#

如果您使用的是OpenCV 2或OpenCV 3,则应使用IMREAD_* 标志(如here中所述)。

** C++ **

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

巨蟒

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

ssm49v7z2#

根据文档,OpenCV支持PNG上的alpha通道。
只需使用CV_LOAD_IMAGE_UNCHANGED作为如下标志来调用imread函数:

cvLoadImage("file.png", CV_LOAD_IMAGE_UNCHANGED)
sxissh06

sxissh063#

读取透明PNG的正确方法是使用第4个通道作为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

mpbci0fu

mpbci0fu4#

如果你想在另一个图像上绘制这个透明的图像,打开你的图像,@satya-mallick(模式IMREAD_UNCHANGED)回答,然后使用这个方法在一个框架Mat上绘制图像:

/**
 * @brief Draws a transparent image over a frame Mat.
 * 
 * @param frame the frame where the transparent image will be drawn
 * @param transp the Mat image with transparency, read from a PNG image, with the IMREAD_UNCHANGED flag
 * @param xPos x position of the frame image where the image will start.
 * @param yPos y position of the frame image where the image will start.
 */
void drawTransparency(Mat frame, Mat transp, int xPos, int yPos) {
    Mat mask;
    vector<Mat> layers;
    
    split(transp, layers); // seperate channels
    Mat rgb[3] = { layers[0],layers[1],layers[2] };
    mask = layers[3]; // png's alpha channel used as mask
    merge(rgb, 3, transp);  // put together the RGB channels, now transp insn't transparent 
    transp.copyTo(frame.rowRange(yPos, yPos + transp.rows).colRange(xPos, xPos + transp.cols), mask);
}
y53ybaqx

y53ybaqx5#

用所有4个通道加载png图像的最佳可能方法是;

img= cv2.imread('imagepath.jpg',negative value)

根据openCV文件,
如果标志值为,
1)=0返回灰度图像。
2)〈0按原样返回加载的图像(带Alpha通道)。

muk1a3rh

muk1a3rh6#

您可以用途:

import matplotlib.image as mpimg

img=mpimg.imread('image.png')
plt.imshow(img)
pgx2nnw8

pgx2nnw87#

在我的例子中,是文件扩展名引起了问题。检查你的png是png还是别的什么;)

相关问题