3

我对cv::imread需要的标志有点困惑。

我的目标是使用此 alpha 通道(即 as )加载具有 alpha 通道的图像CV_8UC4。同时我想总是以 8 位的深度加载它们。

首先,我尝试使用以下内容:

cv::imread(/*path*/, cv::IMREAD_COLOR);

这将剥离 Alpha 通道并返回 8 位图像。对于透明 TIF,一切看起来都不错,只是透明部分是黑色的。对于透明的PNG,悬停,它看起来完全错误。

接下来我尝试的是:

cv::imread(/*path*/, cv::IMREAD_ANYCOLOR);

结果与 完全相同cv::IMREAD_COLOR。下次尝试:

cv::imread(/*path*/, cv::IMREAD_ANYCOLOR | cv::IMREAD_ANYDEPTH);

Alpha 通道仍然不存在,但现在保留了图像的原始深度。

然后我尝试了:

cv::imread(/*path*/, cv::IMREAD_UNCHANGED);

这也适用于 PNG 图像。但是,现在图像的位深度保持不变,不会转换为 8 位。这意味着我必须在一个额外的步骤中对其进行转换。我怀疑这可能不是超级有效。

我还查看了 OpenCV 文档中对标志的描述。那里说:

IMREAD_UNCHANGED    
If set, return the loaded image as is (with alpha channel, otherwise it gets cropped).
IMREAD_GRAYSCALE    
If set, always convert image to the single channel grayscale image.
IMREAD_COLOR    
If set, always convert image to the 3 channel BGR color image.
IMREAD_ANYDEPTH     
If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
IMREAD_ANYCOLOR     
If set, the image is read in any possible color format.

所以显然只IMREAD_UNCHANGED支持阿尔法通道。但是IMREAD_ANYCOLOR,如果我不能用它读取四通道图像,那有什么用呢?

有没有办法加载一个转换为 8 位深度的 alpha 通道的图像?

另一件事对我来说似乎很奇怪:当我使用该选项IMREAD_UNCHANGED并读取具有 alpha 通道的 rgb 图像时,结果似乎是 RGBA。如果我读取没有 alpha 通道的 rgb 图像,格式似乎是 BGR。为什么通道的顺序不同?我认为 OpenCV 总是使用 BGR 排序。

下面是一个带有 alpha 通道的 PNG 在正确加载和错误加载时的外观示例:

在此处输入图像描述 在此处输入图像描述

4

0 回答 0