сглаживание для более темных тонов - PullRequest
0 голосов
/ 27 февраля 2020

(английский sh не мой родной язык, и довольно поздно).

Я сталкиваюсь с проблемами в течение нескольких дней, и после многих неудачных попыток я решил приехать сюда, чтобы получить некоторую помощь или, по крайней мере, направление.

Поговорим о дизеринге и цветных полосах. Я не буду пытаться объяснить, что это такое, я просто предположу, что читатель уже знает.

Хорошо, давайте начнем с картинки

Image without dithering

На этом изображении нет сглаживания. Цветные полосы легко увидеть, если не на стене хотя бы на полу. Поскольку я генерирую это изображение, у меня есть доступ к более высокой точности для каждого пикселя во время генерации. Если канал является целым числом от 0 до 255, у меня есть доступ к значениям, таким как 5.24 (важная вещь - «.24» - это то, что я имею в виду под «более высокой точностью»). Моя оригинальная идея заключалась в том, чтобы использовать шум в зависимости от положения пикселя на экране. Если мы утверждаем, что значения выхода шума находятся в диапазоне от 0 до 1, для 5.24 алгоритм будет выглядеть как

, если (noise (x, y) <0,24) color = 6 else color = 5 </p>

Я также использовал «белый шум» и получил этот результат image with dithering, using white noise

Это намного плавнее, но мы получаем очень высокий шум. Плюс еще есть цветная полоса и это будет проблема у меня . Заменив белый шум на «синий шум», я получаю последнее изображение

image with dithering, using blue noise

, что намного лучше для шумности получаемого изображения но ... все еще есть цветные полосы.

Я пытался выяснить, почему. Я думаю, это потому, что я использую то, что я бы назвал «линейным разделением» или «линейным градиентом» или «линейной интерполяцией» ... или «линейным» чем-то, но это линейно. В формуле, которую я уже дал

if (noise (x, y) <0,24) color = 6 else color = 5 </p>

Если это не 0,24, а 0,5, это означает, что смесь 50/50 из (5,5,5) и (6,6,6). Однако, такое и изображение появится ближе к (6,6,6), чем к (5,5,5). Почему-то я думаю, что неправильно думать, что шаг между (0,0,0) и (1,1,1) такой же, как шаг между (200,200,200) и (201,201,201). Я думаю, что это следует рассматривать не как дополнение, а как соотношение. И вышеприведенная формула не учитывает «5» (она будет вести себя одинаково для 5.24 и 200.24).

Я не знаю, хорошо ли я объясню, и уже очень поздно.

Подводя итог, я ищу формулу, учитывающую не только часть ".24", но не только положение пикселя, но также и часть «5».

Я думаю, что где-то есть экспонента (потому что в opti c всегда есть экспонента), и что результат будет зависеть от монитора (и то, что я ищу, больше относится к cymk, чем к rgb ).

Но все же, что я могу сделать? Есть ли название этому «нелинейному увеличению значения цвета»? Есть ли что-то, что я могу попросить Google?

Большое спасибо.

...