C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Генерация палитры 256 цветов., зависящая от конкретного изображения
Grigoriy
Отправлено: 18.04.2006, 02:38


Мастер участка

Группа: Участник
Сообщений: 381



Вот теперь я после того, как в этом форуме много было тем про работу с растровыми изображениями, спрошу у форумчан вопрос.

А задумывался кто-нибудь из вас о специальной генерации палитры на 256 цветов для конкретного изображения ?
Как известно программа PAINT генерирует палитру 256 цветов неэффективно. И изображения теряют качество более чем достаточно.
Эффективность генерации палитры 256 цветов для изображения состоит в том, что для каждого изображения существует определённая гистограмма цвета.
Допустим, что имеется цветовое пространство P.
Оно трехмерно.
Каждая точка M(x, y, z) в этом пространстве — это некоторое значение цвета.
Тогда для любого растрового изображения существует некоторое множество A этих точек.
Очевидно, что мощность множества A равна количеству пикселов изображения.
Для любой палитры, которая содержит значения цветов аналогично точкам этого пространства, тоже существует некоторое множество B точек. Допустим, что мощность множества B равна 256 (256-цветная палитра).
Тогда для каждой точки M1(x1, y1, z1) из множества A будет соответствовать такая точка M2(x2, y2, z2) из множества B, что расстояние от M1(x1, y1, z1) до M2(x2, y2, z2) будет минимальным.
Точка M2(x2, y2, z2) является наиболее подходящим цветом из палитры цветов для точки M1(x1, y1, z1).

Тогда для любого множества A точек пространства P существует такое множество B точек, что сумма расстояний от каждой точки M(x1,y1,z1) множества A до такой точки множества B, расстояние до которой от точки M(x1,y1,z1) минимально, будет минимальна.
Тогда множество B точек цветового пространства P будем считать наиболее подходящей палитрой.

Каким же образом найти наиболее подходящую палитру для конкретного изображения ?

Определим в цветовом пространстве P скалярное поле S(x, y, z) плотности точек от исходного изображения.
Тогда скалярное поле S1(x, y, z) плотности точек палитры должно быть
выражено

S1(x, y, z) =K * S(x, y, z)

где K = const.

Очевидно, что K равно частному от деления мощности множества B на мощность множества A.

Ну, теперь дело за вами...

Отредактировано Grigoriy — 18/04/2006, 02:45

Вернуться в Вопросы программирования в C++Builder