При уменьшении глубины цвета и размывании с помощью 2-битного шума (с n =] 0,5,1,5 [и output = floor (input * (2 ^ bits-1) + n)), заканчивается диапазон значений (входные значения 0,0 и 1,0 ) шумные. Было бы желательно, чтобы они были однотонными.
Пример: https://www.shadertoy.com/view/llsfz4
(выше скриншот с шейдертой, изображающий градиент и оба конца, которые должны быть сплошным белым и черным соответственно, но вместо этого шумные)
Эту проблему, конечно, можно решить, просто сжав диапазон значений так, чтобы концы всегда округлялись до отдельных значений. Это похоже на хак, и мне интересно, есть ли способ реализовать это "должным образом"?
image-processing
noise
hotmultimedia
источник
источник
Ответы:
TL; DR: 2 * 1LSB. Треугольные-pdf разрывы дизеринга в краевых корпусах при 0 и 1 из-за зажима. Решение состоит в том, чтобы перейти к 1-битному равномерному колебанию в этих случаях.
Я добавляю второй ответ, видя, что это оказалось немного сложнее, чем я первоначально думал. Похоже, что эта проблема была "TODO: нужно зажимать?" в моем коде с тех пор, как я перешел с нормализованного на треугольное сглаживание ... в 2012 году. Приятно наконец посмотреть на него :) Полный код для решения / изображений, использованных в этом посте: https://www.shadertoy.com/view/llXfzS
Прежде всего, вот проблема, которую мы рассматриваем при квантовании сигнала на 3 бита с дизерингом 2 * 1LSB triangular-pdf:
- По сути, что показали hotmultimedia.
При увеличении контраста эффект, описанный в вопросе, становится очевидным: выходной сигнал не усредняется по черно-белому в краевых корпусах (и на самом деле перед этим он значительно превышает 0/1).
Глядя на график, вы получите немного больше информации:
(серые линии обозначают 0/1, также серым цветом обозначен сигнал, который мы пытаемся вывести, желтая линия - среднее значение сглаженного / квантованного выхода, красная - ошибка (среднее значение сигнала)).
Интересно, что не только средний выходной сигнал не равен 0/1 на границах, он также не является линейным (вероятно, из-за треугольного pdf шума). Глядя на нижний предел, становится понятным, почему выходной сигнал расходится: поскольку сигнал со сглаживанием начинает включать отрицательные значения, фиксация на выходе изменяет значение нижних сглаженных участков вывода (то есть отрицательных значений), тем самым увеличивая значение среднего. Иллюстрация выглядит по порядку (равномерное, симметричное смещение 2LSB, среднее значение все еще в желтом цвете):
Теперь, если мы просто используем нормализованный дизеринг 1LSB, в краях-случаях вообще нет проблем, но тогда, конечно, мы теряем хорошие свойства треугольного дизеринга (см., Например, эту презентацию ).
Таким образом, (прагматичное, эмпирическое) решение (хак) должно вернуться к [-0,5; 0,5 [равномерное сглаживание для граничного случая:
Который фиксирует кромки, сохраняя треугольное сглаживание без изменений для оставшегося диапазона:
Поэтому, чтобы не отвечать на ваш вопрос: я не знаю, существует ли более математически надежное решение, и в равной степени стремлюсь узнать, что сделали Мастера прошлого :) До тех пор, по крайней мере, у нас был этот ужасный хак, чтобы поддерживать наш код в работе.
РЕДАКТИРОВАТЬ
Я, вероятно, должен охватить предложение обхода, данное в Вопросе, о простом сжатии сигнала. Поскольку среднее значение не является линейным в крайних случаях, простое сжатие входного сигнала не дает идеального результата - хотя оно фиксирует конечные точки:
Ссылки
источник
dithertri
иdithernorm
вместо независимого. После того, как вы проработаете всю математику и отмените все условия, вы обнаружите, что совсем не рыдаете! Вместо этого код действует как жесткое ограничениеv < 0.5 / depth || v > 1 - 0.5/depth
, мгновенно переключаясь на равномерное распределение. Не то, чтобы это убирало от приятного смешения, которое у вас есть, это просто излишне сложно. Исправление ошибки на самом деле плохо, в результате вы получите худший дизеринг. Просто используйте жесткий отсечение.Я не уверен, что смогу полностью ответить на ваш вопрос, но я добавлю некоторые мысли, и, возможно, мы сможем прийти к ответу вместе :)
Во-первых, основа вопроса для меня немного неясна: почему вы считаете желательным иметь чистый черный / белый, когда в любом другом цвете есть шум? Идеальный результат после сглаживания - ваш оригинальный сигнал с абсолютно равномерным шумом. Если черный и белый различны, ваш шум становится зависимым от сигнала (хотя это может быть хорошо, так как это происходит, когда цвета в любом случае ограничены).
Тем не менее, существуют ситуации, когда наличие шума в белом или черном цветах действительно представляет проблему (мне неизвестны случаи использования, в которых требуется, чтобы и черный, и белый одновременно были «чистыми»): при рендеринге аддитивно смешанной частицы в виде квадрата с текстура, вы не хотите, чтобы шум был добавлен во весь квад, так как это будет видно и за пределами текстуры. Одним из решений является смещение шума, а не добавление [-0,5; 1,5 [вы добавляете [-2,0; 0,0 [(т.е. вычитаете 2 бита шума). Это довольно эмпирическое решение, но я не знаю более правильного подхода. Размышляя об этом, вы, вероятно, также захотите повысить свой сигнал, чтобы компенсировать потерянную интенсивность ...
В некотором роде Тимоти Лоттес выступил на GDC с докладом о формировании шума в тех частях спектра, где он больше всего необходим, и о снижении шума на ярком конце спектра: http://32ipi028l5q82yhj72224m8j-wpengine.netdna-ssl.com/wp- содержание / добавления / 2016/03 / GdcVdrLottes.pdf
источник
Я упростил идею Миккеля Гьоэля о сглаживании треугольным шумом до простой функции, которая требует только одного вызова ГСЧ. Я убрал все ненужные биты, чтобы они были достаточно понятны и понятны:
Для идеи и контекста я отошлю вас к ответу Миккель Гьоэль.
источник