我对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时加载错误以及加载错误时的示例: