Я немного запутался с флагами, которые cv::imread
принимает.
Моя цель состоит в том, чтобы загрузить изображения, которые имеют альфа-канал, с этим альфа-каналом (т.е. как CV_8UC4
). В то же время я хочу загружать их всегда с глубиной 8 бит.
Прежде всего я попытался использовать следующее:
cv::imread(/*path*/, cv::IMREAD_COLOR);
Это лишает альфа-канал и возвращает 8-битное изображение. Для прозрачных TIF-файлов все выглядит правильно, только прозрачные части черного цвета. Для прозрачных PNG, однако, это выглядит совершенно неправильно.
Следующее, что я попробовал, было:
cv::imread(/*path*/, cv::IMREAD_ANYCOLOR);
Результат был точно такой же, как с cv::IMREAD_COLOR
, Следующая попытка:
cv::imread(/*path*/, cv::IMREAD_ANYCOLOR | cv::IMREAD_ANYDEPTH);
Альфа-каналов все еще нет, но теперь оригинальная глубина изображения сохраняется.
Тогда я попробовал:
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-битную глубину?
Еще одна вещь кажется мне довольно странной: когда я использую опцию IMREAD_UNCHANGED
и читать изображение RGB с альфа-каналом, результат, кажется, RGBA. Если я читаю изображение RGB без альфа-канала, формат, кажется, BGR. Почему порядок каналов отличается? Я думал, что OpenCV всегда использует порядок BGR.
Вот пример того, как выглядит PNG с альфа-каналом, когда он загружен напрямую и когда он загружен неправильно:
Задача ещё не решена.
Других решений пока нет …