OpenCV:使用alpha通道加载图像,但深度为8位

时间:2016-09-01 09:53:20

标签: c++ opencv png alpha imread

我对cv::imread占用的标志感到有些困惑。

我的目标是加载具有此Alpha通道的Alpha通道的图像(即CV_8UC4)。同时我想加载它们,总是深度为8位。

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

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

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

我接下来尝试的是:

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支持alpha通道。但是,如果我无法用它读取四通道图像,那么IMREAD_ANYCOLOR是什么?

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

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

以下是一个带有alpha通道的PNG在加载coorecty时加载错误以及加载错误时的示例:

enter image description here enter image description here

0 个答案:

没有答案