Ordered dithering
От: Aniskin  
Дата: 26.04.24 06:12
Оценка:
Пытаюсь научиться переводить полноцветные изображения в изображения RGB333, в которых на каждый канал отводится по три бита, с использованием ordered dithering.

Рассмотрим для простоты матрицу 2x2. В ней есть четыре коэффициента: 0, 2, 3, 1. Эти коэффициенты я делю на три и вычитаю 0.5. Поскольку в палитре RGB333 для каждого канала есть только восемь градаций цветов и соответственно семь промежутков между отдельными градациями, то коэффициенты дополнительно делю на 7. Новые коэффициенты в сумме дают ноль. Все эти манипуляции с коэффициентами нужны для того, чтобы в условном примере, где в палитре есть цвет 8 и 10, и есть равномерно закрашенное изображение цветом 9, то в одних случаях прибавление коэффициента даст цвет ближе к 8, в других ближе к 10, и в среднем яркость результата будет совпадать с оригиналом.

Т.е. для каждого пикселя в соответствии с его положением в изображении я прибавляю соответствующий коэффициент матрицы и ищу в палитре RGB333 наиболее близкий цвет. И в целом получаю достаточно приемлемый результат, общая яркость примерно совпадает (в примере использована матрица 16x16):



Но есть одна проблема. Для обработки изображения я работаю с линейным RGB. А соответствие между обычным RGB и линейным RGB как бы немножно нелинейно Вверху обычные значения, внизу соответствующие им линейные.



Рассчитанные коэффициенты могут работать с простым RGB (но дают некорректную общую яркость результата), но с линейным RGB есть проблемы. В идеале прибавление коэффициента к цвету должно сдвинуть цвет до ближайшего в палитре, но с линейным RGB прибавление коэффициента может привести к перепрыгиванию ближайшего цвета в палитре к следующему, особенно в темных цветах, (хотя это все равно дает более-менее корректную общую яркость результата). Даже если однородно закрашенная поверхность исходного изображения имеет точный цвет из палитры, то вследствие перепрыгиваний в преобразованном изображении она будут составлена из нескольких цветов:



И вот хочется мне это перепрыгивание устранить. В голову приходит идея использовать коэффициенты, зависящие от обрабатываемого цвета. Т.е. чем ниже значение цвета, тем ниже коэффициент. И вот тут я в тупике. Не могу понять и придумать, как сделать эту зависимость.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.