Re: Понижение глубины цвета

From
Sergey Andrianov (2:5020/1507.400)
To
Dmitriy Shevnin
Date
2002-12-12T16:20:52Z
Area
RU.ALGORITHMS
Здравствуй, Dmitriy!

Однажды 09-Dec-02  в 09:29   Dmitriy Shevnin (2:5056/16.40)
написал       Sergey Andrianov    по поводу
-=-   Понижение глубины цвета  -=-

SA>>    Вот здесь и имеет значение алгоритм приведения к фиксированной
SA>> палитре: при округлении можно брать средний, а при дизеринге
SA>> предпочтительнее цвета расположенные ближе к периферии.

DS> расскажите пожалуйста поподробнее, что дает дизеринг и как его осуществить?

	Приведу фрагмент моего письма двух-с-половиной-летней давности, касающегося монохромногг случая. Вообще-то дизеринг служит для сохранения среднего цветового баланса за счет некоторого ухудшения пространственного разрешения. 

- Алгоритмы (2:5017/13.40) ------------------------------------- RU.ALGORITHMS
 Msg  : 917 of 3068 -913                    Loc Scn
 From : Sergey Andrianov                    2:5017/13.40    Вcк 30 Июл 00 10:27
 To   : Sergey Radkevitch
 Subj : Bmp256 -> Bmp2
-2214--------------------------------------------------------------------------
                Здравствyй, yважаемый Sergey!

 Недавно, Чет Июл 27 2000 в 19:01, некто Sergey Radkevitch
 писал Anatoly Ganitsky по поводy Bmp256 -> Bmp2 :

 AG>> Kто подскажет, как пpеобpазовать чёpно-белую каpтинку (с
 AG>> гpадациями) в чёpно-белую без гpадаций (двухцветную)? Только не
 AG>> так, что если яpкость точки больше половины, то это белый, иначе
 AG>> чёpный, а так чтобы была имитация... эээ сеpости :)

 SR> Я на 2-ом куpсе пытался то же самое для 16-ти и 64-х цветов сделать.
 SR> (отобpажение true-color каpтинки на EGA). Вообще, есть такое слово
 SR> dithering, но вот что оно означает - до сих поp точно не знаю :)))
[...]
 SR> Способ 1.
[...]
 SR> 3) получаешь случайное число в диапазоне от 0 до 1
 SR>    если число получилось меньше, чем вычисленная яpкость, то ставишь
 SR>    белую точку, иначе чеpную
   Вообще-то дизеринг отличается от этого алгоритма тем, что добавляется не
случайное число, а ошибка, получившаяся при округлении цвета предыдущей точки.
Т.е. пусть у нас идут подряд точки с яркостью 0.7. Первая точка округляется до
1, ошибка -0.3, складываем ее со следующим числом, получаем 0.7-0.3=0.4,
округляем до 0, ошибка 0.4, складываем со следующим, 0.7+0.4=1.1, округляем до
1, ошибка 0.1 и и.д.
   Это - одномерный случай. В двумерном случае (для плоского изображения)
желательно распространять ошибку не на одну правую точку (при проходе слева
направо), а на возможно бОльшее число соседей, для чего вводим буфер в одну
строку растра для подсчета ошибки и распределяем ее (ошибку) в несколько
соседних точек.
   Считая, что перебор точек идет сверху вниз по строкам, а в строке слева
направо по точкам:
          ***************
          ***************
          *******#о......
          ......ооо......
          ...............
   # - рассматриваемая в данный момент точка,
   * - уже заполненные точки,
   . - свободные точки,
   о - свободные точки, в которые распространяется ошибка.

                                    Не прощаюсь
                                            Sergey

--- ---  Да будет свет !  ---
                  До свидания,  в  16:16 MSK
                                 Sergey

---
 * Origin: Sergiev Posad (2:5020/1507.400)