Как использовать сглаживание для отображения серого изображения только с черными и белыми пикселями?

У меня 256 изображений уровней серого, которые я хочу нарисовать, используя только пиксели #000 (черный) и #FFF (белый) (больше ничего).

Один из способов сделать это - использовать дизеринг: https://upload.wikimedia.org/wikipedia/commons/6/6d/Dithering_example_red_blue.png

В таком алгоритме вид размытия создается путем увеличения количества пикселей (белого и черного для меня) в области.

Однако я не знаю, как это реализовать: как определить количество пикселей для представления требуемого уровня серого? Не могли бы вы написать такой алгоритм (например, использовать псевдокод или Java, Scala, C, C++)?

1 ответ

Существует много различных алгоритмов для создания дизеринга, мой любимый случайный, он прост в реализации, не имеет повторяющихся паттернов, и если вы меняете изображение в каждом кадре, то со временем все это усредняется.

Прежде всего, важной и часто игнорируемой частью является преобразование 256 уровней серого из значений sRGB (гамма-сжатие) в линейные (гамма-несжатый) значения, в противном случае, как в примерах из статьи Википедии "Сглаживание", изображение сглаживания будет слишком ярким. Чтобы выполнить преобразование, используйте таблицу поиска с 256 записями и задайте линейные значения от 0 до 4095.

Затем просто установите свое дизеринг, используя linear_value < (rand()&4095) ? 0 : 255это работает путем сравнения случайного значения от 0 до 4095 с вашим линейным значением, что дает вам черный или белый пиксель. Итак, если у вас linear_value, скажем, 3072 (очень светло-серый), то 3 раза из 4 вы получите белый пиксель, тогда как при значении 41 (темно-серый) вы получите черный 99 раз из 100.

Другие вопросы по тегам