Как я могу раскрасить мое 16-битное изображение в градациях серого с помощью Qt? - PullRequest
0 голосов
/ 16 января 2020

У меня есть 16-битная шкала серого QImage::Format_Grayscale16 из unsigned short значений, смежных в памяти. Он отображается правильно на QLabel после преобразования его в растровое изображение. Теперь мне нужно раскрасить его с помощью заданной таблицы цветов, которая отображает интенсивности на определенное значение RGB:

QVector<QRgb> table_16;
for (double i = 0; i < 4096; ++i) {

    table_16.append(qRgb(
        (int)std::round(std::clamp( -4 * std::abs(i - 4095.0 * 3 / 4) + 4095.0 * 3 / 2, 0.0, 4095.0)),
        (int)std::round(std::clamp(-4 * std::abs(i - 4095.0 * 2 / 4) + 4095.0 * 3 / 2, 0.0, 4095.0)),
        (int)std::round(std::clamp( -4 * std::abs(i - 4095.0 * 1 / 4) + 4095.0 * 3 / 2, 0.0, 4095.0))));

}

table_16[0] = qRgb(4095, 4095, 4095);

Примечание: Изображения на самом деле 12-битные, но сохраняются так же, как и 16-битное изображение. Отсюда ограничение 4096 для отображения RGB.

К сожалению, у меня возникли проблемы. Во-первых, правильное ли преобразование в формат RGB16? Я разместил еще один очень похожий вопрос, но для 8-битной шкалы серого. Qt do c для setColorTable() сообщает:

Только моно chrome и 8-битные форматы.

, поэтому я предполагаю, что не могу используйте это для моего 16-битного изображения. Является ли лучший курс действий, возможно, уменьшить и преобразовать в 8 бит? Любая оптимизация производительности также была бы отличной, потому что изображения должны передаваться в реальном времени.

Ответы [ 2 ]

1 голос
/ 16 января 2020

qRgb(int,int,int) создает QRgb, который хранит 8 бит на канал (в то время как аргументы являются целыми числами, они маскируются против 0xff ). qRgb64(..) будет принимать (и использовать) 16-битные значения для создания QRgb64 с необходимой точностью.

К сожалению, QImage::Format_Indexed16 пока нет (см. QTBUG-75536 ), объясняющий, почему Qt не поддерживает таблицы цветов напрямую с 16-битными оттенками серого. Если вам не нужны контрастные данные в младших 8 битах (или просто в 4 битах в вашем случае, поскольку только 12 старших битов имеют реальные данные), и таблица цветов всегда одинакова, преобразуется в Format_Indexed8 и использует таблица цветов будет самым простым методом.

Если вам нужны контрастные данные в младших битах, вам нужно вручную масштабировать эти 12 бит по 8-битному каналу RGB. Создайте новый QImage с той же шириной / высотой и l oop через исходные данные попиксельно. Gray16Lib - библиотека Qt с примерами различных алгоритмов, которые пытаются сохранить контраст ( заявление об отказе , я написал).

0 голосов
/ 16 января 2020

Одно довольно дорогое решение выглядит следующим образом:

Создайте новое 8-битное изображение, используя convertToFormat(QImage::Format_Grayscale8)

Colorize, создав QImage формата Indexed8, установив его colortable и скопировав 8-битные данные QImage для этого нового изображения в формате Indexed8. Смотрите мой другой вопрос для более подробной информации.

Это работает, но если кто-нибудь знает более быстрый метод, не стесняйтесь отвечать. Там, кажется, много копировать с этим. Я уже должен пройти изображение один раз, чтобы отобразить 12-битный диапазон в 16-битный.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...