我对这些标志有点困惑cv::imread
takes.
我的目标是加载具有 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
完全支持 Alpha 通道。但什么是IMREAD_ANYCOLOR
如果我无法用它读取四通道图像,有什么办法吗?
有什么方法可以加载将 alpha 通道转换为 8 位深度的图像吗?
另一件事对我来说似乎很奇怪:当我使用该选项时IMREAD_UNCHANGED
并读取带有alpha通道的rgb图像,结果似乎是RGBA。如果我读取没有 alpha 通道的 RGB 图像,格式似乎是 BGR。为什么渠道的顺序不同?我认为 OpenCV 总是使用 BGR 排序。
下面是带有 alpha 通道的 PNG 在正确加载和错误加载时的样子: