Как определить, какой цвет "ниже" и / или "выше" в цветовом пространстве CIE-L*a*b* для упорядоченного дизеринга?
Я реализовал несколько функций для преобразования sRGB в цветовое пространство CIE-L*a*b*.
Теперь я хотел бы использовать это для сглаживания, но я не уверен, как точно определить, какой цвет является "более низким", а какой - "более высоким".
При сглаживании в одномерном цветовом пространстве (серая шкала) все просто. При использовании диффузионного сглаживания ошибок я вычисляю ближайшее значение серой шкалы из своей палитры и добавляю ошибку к окружающим пикселям в зависимости от того, какой тип матрицы сглаживания я использую (например, Флойд-Стейнберг). Так как это одномерный, это довольно просто, есть только это одно значение. Но теперь у меня есть это трехмерное цветовое пространство, я должен просто добавить ошибку к каждой координате в отдельности?
(Это единственный способ, который имеет смысл для меня, на данный момент.)
При дизеринге с упорядоченной матрицей дизеринга все становится еще сложнее. Упорядоченные матрицы дизеринга определяют пороговое значение. Для этого мне нужно знать "нижнее" значение пикселя и "более высокое" значение пикселя моего поддона в отношении моего текущего пикселя, который я собираюсь сменить. Теперь я вычисляю расстояние до обоих пикселей, пороговое значение из матрицы дизеринга решает, после чего между этими значениями и соседними пикселями пиксель либо смещается в нижний, либо в верхний пиксель.
(Реальная реализация, конечно, была бы более оптимальной, чем ее вычисление, используя разумно выбранную матрицу для значений цвета серой шкалы в моем поддоне. Также такие вещи, как выбор поддона с равномерно распределенными значениями цвета и т. Д.)
Это - опять же - довольно легко в одномерном цветовом пространстве. но в CIE-L*a*b* нет "более высокого" или "более низкого" значения как такового.
Использование только яркости для применения пороговой матрицы, кажется довольно неправильным, у меня может быть два цвета с одинаковой яркостью в моем поддоне, тогда что?
2 ответа
Эта статья описывает проблему очень близко к вашему вопросу, а затем приступает к предоставлению алгоритма для ее решения:
Надеюсь, это поможет.
Когда вы сглаживаете в более чем одном измерении, вы хотите квантовать значения и распространять ошибку в каждом измерении независимо.
Начиная с 3-канального изображения RGB в качестве примера: разделите компоненты на три изображения в оттенках серого, смажьте их независимо, а затем объедините их обратно в цветное изображение. Ошибка в одном канале не знает об ошибке в других каналах... не зацикливайтесь на ΔE или чем-либо еще.
Та же концепция применима к дизерингу в CIE-Lab, даже для заказанного дизеринга. Дизеринг будет применяться независимо на каждом канале. Не беспокойтесь о евклидовом расстоянии между пикселями, просто рассмотрите дельту на отдельном канале.
"Высшее" и "низшее" легко усваивается в одномерной среде. Даже для отдельных каналов CIElab.
Вы правы, что не хотите применять пороговую матрицу только к каналу яркости! Я полагаю, что вам понадобятся три пороговые матрицы, по одной для каждого канала, которые определяются в зависимости от того, как вы настроили свою палитру. (эти матрицы могут быть одинаковыми, могут отличаться в зависимости от того, как вы распределяете значения палитры по каналам)
В трех каналах вы можете визуализировать свою палитру в виде куба (xyz). Поэтому, когда канал яркости квантуется до определенного значения, это может определять координату X, но у вас все еще есть целый диапазон значений в направлениях Y и Z. Эти координаты определяются тем, как квантованы другие каналы. Создайте палитру таким образом, чтобы каналы можно было варьировать независимо. Вам даже не нужно иметь одинаковое количество уровней квантования в каждом измерении. Вы можете выбрать только 3 возможных значения яркости и использовать остальную часть палитры для более точного изменения каналов A/B. (вот почему ваши три пороговые матрицы могут отличаться.)