OpenCV: загрузить изображение с альфа-каналом, но глубиной 8 бит

Я немного запутался с флагами, которые 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 с альфа-каналом, когда он загружен напрямую и когда он загружен неправильно:

введите описание изображения здесь
введите описание изображения здесь

2

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]