Как создать палитру [Метод медианного сечения]
Допустим, у нас нет нет информации, сколько точек какого цвета используется. Есть лишь много (256 - N -5000) цветов, которые в принципе имеют одинаковое право иметь хорошего представителя в 256-палитре. Как создать идеальную для совокупности этих цветов 256-палитру? чтобы хорошо выглядели как плавные переходы цвета, так и редкие в этом наборе цвета?
Палитры и оптимизация палитр
Собираясь писать картину, художник подбирает палитру красок, с которой он и будет затем работать. Палитра определяет цвета, которые будут использоваться в картине. Если возникнет необходимость, то дополнительные цвета можно получить смешиванием красок, уже включенных в палитру.
В компьютерах тоже используются палитры, но компьютерные цветовые палитры более ограничены. Действительно, чертежная или иллюстративная программа, пытающаяся со всеми подробностями вывести изображение, содержащее тысячи оттенков на графический дисплей, который поддерживает максимум 256 цветов, никак не сможет использовать более 256 цветов одновременно. Остается единственная надежда на дитеринг. Но даже ювелирно настроенный диффузный дитеринг будет вряд ли эффективен, если цвета палитры плохо подобраны. В конечном счете, программа должна сделать все возможное для того, чтобы краски палитры как можно лучше соответствовали оттенкам изображения.
Одной из проблем, возникающих время от времени в компьютерной графике, является проблема выбора цветовой палитры, с помощью которой можно отобразить картинку с количеством оттенков, превышающим количество цветов в палитре. Какая комбинация цветов даст наилучший результат? Ответ на этот вопрос дает процесс, который называют оптимизацией палитры. Самый простой подход заключается в том, чтобы, перебрав все пикселы в картинке, посчитать сколько раз встречается каждый цвет и составить палитру из тех цветов, которые встречаются чаще других. Если некоторый оттенок синего цвета встречается 100 раз, а оттенок красного только 20, то, очевидно, предпочтение отдается синему цвету. Но этот метод имеет несколько недостатков. Один из них заключается в том, что некоторые цвета будут исключены напрочь. Представьте себе картинку с загородной дорогой, где преобладают синие, коричневые, желтые, зеленые тона, и где-то в одном углу оказался маленький красный, дорожный знак "стоп". Если красный цвет более нигде на этой картинке не встречается, то он не попадет в палитру, и, следовательно, "кирпич" будет окрашен в какой-то другой цвет.
Возможно, лучше было бы выбрать комплект цветов для палитры с равномерно распределенными красной, зеленой и синей компонентами. Такой подход обеспечивает широкий выбор цветов, но при этом не учитывается тот факт, что в большинстве картинок нет равномерного цветового распределения. А "кирпич" хотелось бы отчетливо показать, не утратив ничего в тонких оттенках неба, деревьев и дороги.
Другое решение проблемы это метод квантования цветов медианным сечением. Цветовое пространство рассматривается как трехмерный куб. Каждая ось куба соответствует одному из трех основных цветов: красному, зеленому или синему. Каждая из трех сторон разбивается на 255 равных частей, деления на осях нумеруются от 0 до 255, причем большее значение соответствует большей интенсивности цвета. Вы можете отмечать точки внутри куба, соответствующие цветам так же, как точки трехмерного графика, если бы вам заданы x,y и z координаты точки. К примеру, если значения красной, зеленой и синей компонент есть 128, 64 и 192 соответственно, то вы можете отложить на оси К 128, на оси З 64, на оси С 192 и получить точку внутри куба, соответствующую данному цвету. Черный цвет с компонентами 0, 0, 0, попадет на одну вершину куба, а белый с компонентами 255, 255, 255, в другую, диагонально противоположную вершину. Если бы вы отметили точки внутри куба, соответствующие цветам пикселов в обычном полноцветном изображении, вы бы обнаружили, что точки отнюдь не равномерно разбросаны по всему кубу; очевидна тенденция группирования точек в отдельных регионах.
Метод медианного сечения делит куб на 256 параллелепипедов, каждый из которых содержит примерно одинаковое количество пикселов. При таком разбиении куба центральная точка каждого параллелепипеда представляет оптимальный выбор для цветовой палитры. И в самом деле, в той области куба, которая густо заполнена точками, будет больше параллелепипедов и, соответственно, в палитру попадет больше цветов. А там, где точек меньше, оттуда и цветов будет взято меньше. и один цвет не будет отброшен полностью. Тем же цветам, которые встречаются чаще, будет отдано предпочтение. Обратимся еще раз к примеру с загородной дорогой. Цвета в палитре, полученной медианным сечением, будут концентрироваться вокруг синего, коричневого, желтого и зеленого, но по крайней мере найдется один оттенок с достаточной красной компонентой, чтобы аппроксимировать цвет знака "стоп". у, а теперь, как же все-таки работает метод медианного сечения при квантовании цветов.
Метод квантования цветов медианным сечением
1. Метод квантования цветов с помощью медианного сечения применяется при выборе 256 цветов, чтобы представить полноцветное изображение, содержащее несколько тысяч цветов. Чтобы понять как работает метод медианного сечения, мы представим цветовое пространство как куб. Каждая ось соответствует одному из трех основных цветов и деления на оси нумеруются от 0 до 255; большему номеру соответствует большая интенсивность цвета. Цвета в изображении отмечаются внутри куба так же, как точки на трехмерном графике.
2. Первый шаг состоит в отсечении "краёв" куба, которые не содержат пикселов. К примеру, если у всех пикселов значения красной компоненты не меньше, чем 8 и не больше, чем 250, то отбрасываются части куба от К="0" до К="7" и от К="251" до К="255."
3. Второй шаг заключается в разрезании полученного параллелепипеда на два в срединной точке (медиане) самой длинной стороны. Если самая длинная сторона параллельна оси B, то компьютер выбирает срединное синее значение из всех синих значений представленных в параллелепипеде (к примеру, 50.000-ое вхождение в отсортированном списке из 100.000 синих значений) и разрезает в этой точке. Теперь параллелепипед разделен на два параллелепипеда меньшего размера, содержащих одинаковое количество пикселов.
4. Весь предыдущий процесс отсечение пустых "краев" и разрезание самой длинной стороны в срединной точке повторяется для двух меньших параллелепипедов. Теперь исходный куб разделен на четыре параллелепипеда, содержащих приблизительно одинаковое количество пикселов.
5. Медианное сечение повторно применяется для того, чтобы разделить куб на 8, 16, 32, 64, 128 и 256 параллелепипедов. Они содержат примерно одно и то же количество пикселов и их объемы обратно пропорциональны плотностям пикселов.
6.Имея пространство, разделенное таким образом, легко выбрать палитру. Каждый из 256 параллелепипедов содержит пикселы приблизительно одинакового цвета и центр каждого параллелепипеда представляет оптимальное значение цвета для палитры. Имея координаты вершин, очень просто вычислить координаты центральной точки. (екоторые графические программы вместо того, чтобы вычислять центральную точку, усредняют значения всех пикселов находящихся внутри параллелепипеда; на вычисления уйдет больше времени, но полученная палитра будет лучше.) Вычислив R, G и B координаты для всех 256 центральных точек в параллелепипедах, получим 256 цветов, которые и будут составлять палитру.