Как использовать сглаживание для отображения серого изображения только с черными и белыми пикселями?
У меня 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.