我对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 在正确加载和错误加载时的外观示例: