Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
метод_курс_кэм_new.doc
Скачиваний:
14
Добавлен:
06.02.2016
Размер:
653.82 Кб
Скачать
    1. Альфа канал

Чёрно-белые и полноцветные изображения глубиной от 8 до 16 битов также могут содержать не сопоставленные данные альфа канала, называемые альфа маской. Если используются данные альфа маски, каждый чёрно-белый или полноцветный пиксель содержит дополнительно значение альфа канала для данного пикселя. Изображения с индексированными цветами могут содержать альфа канал в блоке прозрачности.

Альфа значение определяет уровень прозрачности пикселя. Минимальное значение битовой глубины (всегда 0) указывает на абсолютную прозрачность, а максимальное значение либо отсутствие как таковое альфа маски указывает на полную непрозрачность.

  1. АЛГОРИТМ СЖАТИЯ RLE

Данные файла PCX/BMP сжимаются с помощью простого байт-ориентированного алгоритма (RLE) группового кодирования. Ниже представлен алгоритм декодирования, алгоритм кодирования выглядит с точностью до наоборот. После прочтения заголовка и вычисления всех необходимых величин, таких как размеры изображения, количества цветов и установки палитры, начинаем читать данные изображения, которые идут сразу за заголовком по одному байту.

Алгоритм выглядит так:

1 Читаем байт 2 Если два старших бита установлены в 1,т.е. "байт">=0С0h(192), преобразовать байт в счетчик группы по формуле (("байт"-192)+1). Иначе, 4. 3 Прочитать следующий байт и записать этот байт столько раз, сколько указанно в счетчике. 4 Записать литерал один раз. 5 Если буфер не полон, 1.

  1. АЛГОРИТМ СЖАТИЯ LZW

Данные файлов GIF хранятся в упакованном виде сжатым алгоритмом LZW (Lempel-Ziv Welch).

Для того что бы лучше уяснить суть метода необходимо ввести ряд определений:

"Символ": фундаментальный элемент данных. В обычных текстовых файлах это отдельный байт. В растровых изображениях, это индекс, который указывает цвет данного пиксела. Будем ссылаться на произвольный символ как на "K".

"Поток символов": поток символов такой, как файл данных.

"Цепочка": несколько последовательных символов. Длина цепочки может изменяться от 1 до очень большого числа символов. Можно указывать произвольную цепочку как "[...]K".

"Префикс": почти то же самое, что цепочка, но подразумевается, что префикс непосредственно предшествует символу, и префикс может иметь нулевую длину. Будем ссылаться на произвольный префикс, как на "[...]".

"Корень": односимвольная цепочка. Для большинства целей это просто символ, но иногда это может быть иначе. Это [...]K, где [...] пуста.

"Код": число, определяемое известным количеством бит, которое кодирует цепочку.

"Поток кодов": выходной поток кодов, таких как "растровые данные".

"Элемент": код и его цепочка.

"Таблица цепочек": список элементов обычно, но не обязательно, уникальных.

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

Рассмотрим обычное кодирование и декодирование с помощью LZW-алгоритма. В GIF используется этот алгоритм.

При сжатии и раскрытии LZW манипулирует тремя объектами: потоком символов, потоком кодов и таблицей цепочек. При сжатии поток символов является входным и поток кодов - выходным. При раскрытии входным является поток кодов, а поток символов - выходным. Таблица цепочек порождается и при сжатии и при раскрытии, однако она никогда не передается от сжатия к раскрытию и наоборот.

Первое что необходимо сделать при LZW-сжатии является инициализация цепочки символов. Чтобы сделать это, нам необходимо выбрать код размера (количество бит) и знать сколько возможных значений могут принимать наши символы. Положим код размера равным 12 битам, что означает возможность запоминания 0FFF, или 4096, элементов в нашей таблице цепочек. Также предположим, что имееся 32 возможных различных символа. (Это соответствует, например, картинке с 32 возможными цветами для каждого пиксела.)

Чтобы инициализировать таблицу, мы установим соответствие кода #0 символу #0, кода #1 to символу #1, и т.д., до кода #31 и символа #31. На самом деле показано, что каждый код от 0 до 31 является корневым. Больше в таблице не будет других кодов, обладающих этим свойством.

Теперь начнем сжатие данных. Сначала определим нечто, называемое "текущим префиксом". Этот префикс будем постоянно помнить и проводить сравнение с ним здесь и в дальнейшем. Будем обозначать его как "[.c.]". Изначально текущий префикс ничего не содержит. Также определим "текущую цепочку", которая образуется текущим префиксом и следующим символом в потоке символов. Обозначать текущую цепочку как "[.c.]K", где K - некоторый символ.

Теперь посмотрим на первый символ в потоке символов. Назовем его P. Сделаем [.c.]P текущей цепочкой. (В данной точке это, конечно, корень P.) Теперь выполним поиск в таблице цепочек, чтобы определить входит ли в нее [.c.]P. Конечно, сейчас это произойдет, поскольку в нашу таблицу при инициализации были помещены все корни. В этом случае мы ничего не делаем. Теперь делаем текущим префиксом [.c.]P.

Берем следующий символ из потока символом. Назовем его Q. Добавим текущий префикс, чтобы сформировать [.c.]Q, т.е. текущую цепочку. Выполняем поиск в таблице цепочек, чтобы определить входит ли в нее [.c.]Q. В данном случае этого, конечно, не будет. Добавим [.c.]Q (которая в данном случае есть PQ) в таблицу цепочек под кодом #32,и выведем код для [.c.] в поток кодов. Теперь начнем опять с текущего префикса, соответствующего корню P. Продолжаем добавление символов к [.c.], чтобы сформировать [.c.]K, до тех пор, пока мы не сможем найти [.c.]K в таблице цепочек. Затем выводим код для [.c.] и добавляем [.c.]K в таблицу цепочек. На псевдокоде алгоритм будет описан приблизительно так:

[1] Инициализация таблицы цепочек;

[2] [.c.] <- пусто;

[3] K <- следующий символ в потоке символов;

[4] Входит ли [.c.]K в таблицу цепочек?

(да: [.c.] <- [.c.]K;

go to [3];

)

(нет: добавить [.c.]K в таблицу цепочек;

вывести код для [.c.] в поток кодов;

[.c.] <- K;

go to [3];

)

Предположим, что мы имеем 4-символьный алфавит: A,B,C,D. Поток символов выглядит как ABACABA. Сначала инициализируем нашу таблицу цепочек: #0=A, #1=B, #2=C, #3=D. Первый символ есть A, который входит в таблицу цепочек, следовательно [.c.] становится равным A. Далее мы берем AB, которая не входит в таблицу, следовательно мы выводим код #0 (для [.c.]), и добавляем AB в таблицу цепочек с кодом #4. [.c.] становится равным B. Далее берем [.c.]A = BA, которая не входит в таблицу цепочек, следовательно выводим код #1, и добавляем BA в таблицу цепочек с кодом #5. [.c.] становится равным A. Далее мы берем AC, которая не входит в таблицу цепочек. Выводим код #0, и добавляем AC в таблицу цепочек с кодом #6. Теперь [.c.] равно C. Далее берем [.c.]A = CA, которая не входит в таблицу. Выводим #2 для C, и добавляем CA к таблице под кодом #7. Теперь [.c.]=A. Далее берем AB, которая входит в таблицу цепочек, следовательно [.c.] становится равным AB, и мы ищем ABA, которой нет в таблице цепочек, поэтому мы выводим код для AB, который равен #4, и добавляем ABA в таблицу цепочек под кодом #8. [.c.] равно A. Нельзя взять более символов, поэтому мы выводим код #0 для A и заканчиваем. Следовательно, поток кодов равен #0#1#0#2#4#0.

Это все, о чем следует заботиться при сжатии. Раскрытие более сложно концептуально, однако программная реализация его проще.

Опишем как это делается. Начинаем с инициализации таблицы цепочек. Эта таблица образуется исходя из тех знаний, которыми мы располагаем о порождаемом в конце концов потоке символов, например, о возможных значениях символов. В GIF-файлах эта информация находится в заголовке, как число возможных значений пикселов. Однако, прелесть LZW состоит в том, что это все, что нам нужно. Сжатие было выполнено таким образом, что никогда не встретится в потоке кодов код, который нельзя было бы преобразовать в цепочку.

Необходимо определить нечто, называемое "текущим кодом", на что будем ссылаться как "<code>", и "старым кодом", на который будем ссылаться как "<old>". Чтобы начать распаковку возьмем первый код. Теперь он становится <code>. Этот код будет инициализировать таблицу цепочек в качестве корневого. Выводим корень в поток символов. Делаем этот код старым кодом <old>.

(*) Теперь берем следующий код и присваиваем его <code>. Возможно, что этот код не входит в таблицу цепочек, но пока предположим, что он там есть. Выводим цепочку, соответствующую <code> в поток символов. Теперь найдем первый символ в цепочке, которую только что получили. Назовем его K. Добавим его к префиксу [...], сгенерированному посредством <old>, чтобы получить новую цепочку [...]K. Добавим эту цепочку в таблицу цепочек и установим старый код <old> равным текущему коду <code>.

Теперь рассмотрим ту возможность, что <code> не входит в таблицу цепочек. Вернемся обратно к сжатию и постараемся понять, что происходит, если во входном потоке появляется цепочка типа P[...]P[...]PQ. Предположим, что P[...] уже находится в таблице, а P[...]P - нет. Кодировщик выполнит грамматический разбор P[...], и обнаружит, что P[...]P отсутствует в таблице. Это приведет к выводу кода для P[...] и добавлению P[...]P в таблицу цепочек. Затем он возьмет P[...]P для следующей цепочки и определит, что P[...]P есть в таблице и выдаст выходной код для P[...]P, если окажется, что P[...]PQ в таблице отсутствует.

Декодировщик всегда находится "на один шаг сзади" кодировщика. Когда декодировщик увидит код для P[...]P, он не добавит этот код к своей таблице сразу, поскольку ему нужен начальный символ P[...]P для добавления к цепочке для последнего кода P[...], чтобы сформировать код для P[...]P. Однако, когда декодировщик найдет код, который ему еще неизвестен, он всегда будет на 1 больше последнего добавленного к таблице. Следовательно, он может догадаться что цепочка для этого кода должна быть и, фактически, всегда будет правильной.

Пример: Предположим, что мы имеем растровое изображение в котором первые три пиксела имеют одинаковый цвет. Т.е. поток символов выглядит как : QQQ.... Для определенности давайте скажем, что мы имеем 32 цвета и Q соответствует цвету #12. Кодировщик сгенерирует последовательность кодов 12,32,.... спомним, что код #32 не входит в начальную таблицу, которая содержит коды от #0 до #31. Декодировщик увидит код #12 и транслирует его как цвет Q. Затем он увидит код #32, о значении которого он пока не знает. Но если он подумает о нем достаточно долго, он сможет понять, что QQ должно быть элементом #32 в таблице и QQ должна быть следующей цепочкой вывода.

Таким образом, псевдокод декодирования можно представить

следующим образом:

[1] Инициализация строки цепочек;

[2] взять первый код: <code>;

[3] вывести цепочку для <code> в поток символов;

[4] <old> = <code>;

[5] <code> <- следующий код в потоке кодов;

[6] существует ли <code> в таблице цепочек?

(да: вывод цепочки для <code> в поток символов;

[...] <- трансляция для <old>;

K <- первый символ трансляции для <code>;

добавить [...]K в таблицу цепочек;

<old> <- <code>;

)

(нет: [...] <- трансляция для <old>;

K <- первый символ [...];

вывод [...]K в поток символов и добавление его к

его к таблице цепочек;

<old> <- <code>

)

[7] go to [5];

Если обнаруживается на шаге [5], что нет больше символов, вы необходимо закончить.

В формате GIF это реализовано следующим образом. В части заголовка GIF-файла существует поле, называемое в потоке растровых данных "кодом размера". На самом деле это "размер корня". Фактический размер (в битах) кодов сжатия в действительности изменяется в процессе сжатия/раскрытия, и будем ссылаться на него здесь, как на "размер сжатия".

Начальная таблица, как обычно, содержит коды для всех корней, но к ее верхней части добавляются два специальных кода. Предположим имеем "размер кода", который обычно равен числу битов на пиксел. Обозначим его N. Если число битов на пиксел равно 1, N должно равняться 2: корни занимают ячейки #0 и #1 в начальной таблице и два специальных кода будут занимать ячейки #4 #5. В любом другом случае N равно числу битов на пиксел, корни занимают ячейки от #0 до #(2**N-1), а специальные коды равны (2**N) и (2**N + 1).

Начальный размер сжатия будет равен N+1 биту на код. Если ведётся кодирование, то выводим сначала коды длиной (N+1) бит и, если ведётся декодирование, то выбираем сначала (N+1) бит из потока кодов. В качестве специальных кодов используются: <CC> или код очистки, равный (2**N), и <EOI> или конец информации, равный (2**N + 1). <CC> говорит кодировщику, что нужно снова инициализировать таблицу цепочек и переустановить размер сжатия равным (N+1). <EOI> означает что кодов больше нет. Если вы ведете кодирование или декодирование, вы должны начать добавление элементов в таблицу цепочек с <CC> + 2. Если вы ведете кодирование, вам следует вывести <CC> в качестве самого первого кода, и затем опять каждый раз, как только вы достигните кода #4095 (шестнадцатиричное FFF), поскольку GIF не допускает размера сжатия большего 12 бит. Если вы ведете раскрытие, вам следует реинициализировать вашу таблицу цепочек, как только вы обнаружите <CC>.

Переменный размер сжатия на самом деле не доставляет особых

трудностей. Если ведётся кодирование то начинаем с размера сжатия в (N+1) битов, и, как только вы выведете код (2**(размер сжатия)-1), вы увеличиваете размер сжатия на один бит. Следовательно, следующий код вашего вывода будет на один бит длиннее. Помните, что наибольший размер сжатия равен 12 битам, что соответствует коду 4095. Если вы достигли этого предела, вы должны вывести <CC> в качестве следующего кода и начать сначала. Если вы ведете декодирование, вы должны увеличить ваш размер сжатия как только вы запишите элемент #(2**(размер сжатия) - 1) в таблицу цепочек. Следующий код, который вы прочитаете будет на один бит длиннее.

  1. Создание некоторых видеоэффектов

Существует много прикладных задач в которых необходимо подвергать изображения каким либо изменениям, многие из них принято называть видеоэффектами. Для примера можно назвать задачу обработки аэрофотосьёмки, обработка позволяет определить участки суши на которых происходит эррозия почвы, так же можно определить месторождения полезных ископаемых, области загрязнения.

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

Существует базовый набор видеоэффектов на основе которых строятся другие более сложные эффекты путём последовательного применения базовых. Среди простейших эффектов можно назвать негатив, эффект шума, логические операции над изображениями, выравнивание изображения по контрольному цвету, разложение по цветовым координатам, объединение по цветовому базису, матричная линейная фильтрация.

9.1 Разложение по цветовым координатам

Зрение является важнейшей сенсорной системой человека, 90% информации человек получает именно через зрение. Зрение может различать основные цвета, оттенки, яркость и тд. Работа периферийных устройств вывода графической информации (принтеры, мониторы…)основана на особенностях зрения и строения глаза.

Светочувствительным элементом глаза является сетчатка. Свет попадает в глаз через роговицу и фокусируется хрусталиком на сетчатке. Сетчатка преобразует свет в импульсы в нервных волокнах и состоит из трех слоев клеток.

Внутренний слой сетчатки глаза содержит два типа светочувствительных рецепторов, занимающих область с раствором около 170° относительно зрительной оси: 100 млн. палочек (длинные и тонкие рецепторы ночного зрения), 6.5 млн. колбочек (короткие и толстые рецепторы дневного зрения).

Информация от рецепторов передается в мозг по зрительному нерву, содержащему около 800 тысяч волокон. Колбочки и палочки содержат зрительные пигменты.

Информация от светочувствительных рецепторов (колбочек и палочек) передается другим типам клеток, которые соединены между собой. Специальные клетки передают информацию в зрительный нерв. Таким образом волокно зрительного нерва обслуживает несколько светочувствительных рецепторов, т.е. некоторая предварительная обработка изображения выполняется непосредственно в глазу, который по сути представляет собой выдвинутую вперед часть мозга.

Область сетчатки, в которой волокна зрительного нерва собираются вместе и выходят из глаза, лишена светочувствительных рецепторов и называется слепым пятном.

Радужная оболочка действует как диафрагма, изменяя количество света, проходящего в глаз. Диаметр зрачка меняется от ~ 2 мм (при ярком свете) до ~ 8 мм (при малой освещенности).

За сетчаткой находится сосудистая оболочка, которая содержит капилляры, снабжающие глаз кровью. Наружная оболочка глаза - склера, состоит их плотных волокон.

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

Колбочек существует три типа отличающихся фоточувствительным пигментом. Колбочки обычно называют "синими", "зелеными" и "красными" в соответствии с наименованием цвета, для которого они оптимально чувствительны. Упомянутые три пигмента имеют максимальные поглощения приблизительно на 430, 530 и 560 нм. Этим длинам волн соответствует не синий, зеленый и красный цвета, а фиолетовый, сине-зеленый и желто-зеленый.

В силу того, что коэффициент преломления в радужке и хрусталике растет с увеличением частоты света, глаз не избавлен от хроматической аберрации. Т.е. если изображение сфокусировано для одной из частот, то на других частотах изображение расфокусировано. Хрусталик оптимально фокусирует на сетчатке свет с длиной волны около 560 нм. Так как пики чувствительности средне- длинноволновых колбочек (530 и 560 нм, соответственно) близки к друг к другу, поэтому изображения для этих колбочек могут быть одновременно сфокусированными. Изображение же для коротковолновых палочек будет размытым.

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

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

Для самосветящихся объектов используется аддитивное формирование оттенков, когда требуемый цвет формируется за счет смешения трех основных оттенков цветов. В этом случае удобно использование модели смешения RGB (Red, Green, Blue - красный, зеленый, синий).

Для несамосветящихся объектов используется субтрактивное формирование оттенков, основанное на вычитании из падающего света определенных длин волн. В этом случае удобно использование модели смешения CMY (Cyan, Magenta, Yellow - голубой, пурпурный, желтый).

Цвета одной модели являются дополнительными к цветам другой модели. Дополнительный цвет - цвет, дополняющий данный до белого. Дополнительный для красного - голубой (зеленый+синий), дополнительный для зеленого - пурпурный (красный+синий), дополнительный для синего - желтый (красный+зеленый) и т.д.

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

Назначение цветовой модели - дать средства описания цвета в пределах некоторого цветового охвата, в том числе и для выполнения интерполяции цветов. Наиболее часто в компьютерной графике используются модели RGB, CMY, YIQ, HSV и HLS.

9.2 Модель RGB

RGB (Red, Green, Blue - красный, зеленый, синий) - аппаратно-ориентированная модель, используемая в дисплеях для аддитивного формирования оттенков самосветящихся объектов (пикселов экрана). Система координат RGB - куб с началом отсчета (0,0,0), соответствующим черному цвету (рисунок 1). Максимальное значение RGB - (1,1,1) соответствует белому цвету.

  1. Рисунок 1 – Модель RGB

Программная реализация разложения приведена в приложении А.

9.3 Модель CMY

CMY (Cyan, Magenta, Yellow - голубой, пурпурный, желтый) - аппаратно-ориентированная модель, используемая в полиграфии для субтрактивного формирования оттенков, основанного на вычитании слоем краски части падающего светового потока. Цвета модели CMY являются дополнительными к цветам модели RGB, т.е. дополняющими их до белого. Таким образом система координат CMY - тот же куб, что и для RGB, но с началом отсчета в точке с RGB координатами (1,1,1), соответствующей белому цвету. Цветовой куб модели CMY показан на рисунке 2.

    1. Рисунок 2 - Цветовой куб модели CMY

Программная реализация разложения приведена в приложении А

Преобразования между пространствами RGB и CMY определяются следующим образом: [ R G B ] = [1 1 1] – [ C M Y ].

Причем единичный вектор-строка в модели RGB - представление белого цвета, а в модели CMY - черного.

9.4 YIQ

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

Y

=

0.299

0.587

0.114

R

I

0.596

-0.274

-0.322

G

Q

0.211

-0.522

0.311

B

R

=

1.0

0.956

0.623

Y

G

1.0

-0.272

-0.648

I

B

1.0

-1.105

0.705

Q

9.5 Модель HSV

HSV (Hue, Saturation, Value - цветовой тон, насыщенность, количество света или светлота) - модель, ориентированная на человека и обеспечивающая возможность явного задания требуемого оттенка цвета (рисунок 3).

Подпространство, определяемое данной моделью - перевернутый шестигранный конус.

По вертикальной оси конуса задается V - светлота, меняющаяся от 0 до 1. Значению V = 0 соответствует вершина конуса, значению V = 1 - основание конуса; цвета при этом наиболее интенсивны.

Цветовой тон H задается углом, отсчитываемым вокруг вертикальной оси. В частности, 0° - красный, 60° - желтый, 120° - зеленый, 180° - голубой, 240° - синий, 300° - пурпурный, т.е. дополнительные цвета расположены друг против друга (отличаются на 180°).

Насыщенность S определяет насколько близок цвет к "чистому" пигменту и меняется от 0 на вертикальной оси V до 1 на боковых гранях шестигранного конуса.

      1. Рисунок 3 – Разложение HSV

Точка V = 0, в которой находится вершина конуса, соответствует черному цвету. Значение S при этом может быть любым в диапазоне 0-1. Точка с координатами V = 1, S = 0 - центр основания конуса соответствует белому цвету. Промежуточные значения координаты V при S=0, т.е. на оси конуса, соответствуют серым цветам. Если S = 0, то значение оттенка H считается неопределенным.

Программная реализация разложения приведена в приложении А

9.6 Модель HLS

HLS (Hue, Lightness, Saturation - цветовой тон, светлота, насыщенность) - модель ориентированная на человека и обеспечивающая возможность явного задания требуемого оттенка цвета (рис.4). Эта модель образует подпространство, представляющее собой двойной конус, в котором черный цвет задается вершиной нижнего конуса и соответствует значению L = 0, белый цвет максимальной интенсивности задается вершиной верхнего конуса и соответствует значению L = 1. Максимально интенсивные цветовые тона соответствуют основанию конусов с L = 0.5, что не совсем удобно.

Цветовой тон H, аналогично системе HSV, задается углом поворота.

Насыщенность S меняется в пределах от 0 до 1 и задается расстоянием от вертикальной оси L до боковой поверхности конуса. Т.е. максимально насыщенные цветовые цвета располагаются при L=0.5, S=1.

В общем, систему HLS можно представить как полученную из HSV "вытягиванием" точки V=1, S=0, задающей белый цвет, вверх для образования верхнего конуса.

  1. Рисунок 4 – Разложение HLS

Програмная реализация разложения прирведена в приложении А.

9.7 Использование RGB

Растровые дисплеи, как правило, используют аппаратно-ориентированную модель цветов RGB.

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

В полноцветных дисплеях для каждого пиксела в видеопамять заносится тройка значений RGB. В этом случае при необходимости отображения пиксела из видеопамяти непосредственно выбирается тройка значений RGB, которая и передается на монитор (но может и передаваться в таблицу цветности).

В модели RGB легко задавать яркости для одного из основных цветов, но по крайней мере затруднительно задать оттенок с требуемым цветовым тоном и насыщенностью.

В различного рода графических редакторах эта задача обычно решается с помощью интерактивного выбора из палитры цветов и формированием цветов в палитре путем подбора значений RGB до получения требуемого визуального результата. Более удобно в этом случае использовать модели HVS или HLS, позволяющие непосредственно задать требуемый оттенок.

Конечно, при занесении данных в таблицу цветности или для полноцветных дисплеев - в видеопамять требуется перевод в значений в систему RGB.

9.8 Эффект шума

Иногда при работе с видеоизображениями необходимо реализовать эффект телевизионного шума. Этот эффект является очень простым. В основе этого метода лежит разложение изображения на базис R G B и затем сумированием к каждому элементу базиса некоторого случайного значения которое может зависить по какому либо закону от уровня шума

Пример(миксирование белого шума к изображению):

for y := 0 to Ys do

for x := 0 to Xs do begin

t := GetArrPixel(Xs + 1 , x, Ys-y, PictArrs[Num]); //исходный пиксел

r := (t and $FF0000) shr 16;

g := (t and $FF00) shr 8;

b := t and $FF;

nr := Level - random (Level*2);

r := r + nr;

g := g + nr;

b := b + nr;

if r < 0 then r := 0 else if r > 255 then r := 255;

if g < 0 then g := 0 else if g > 255 then g := 255;

if b < 0 then b := 0 else if b > 255 then b := 255;

e := b or (g shl 8) or (r shl 16);

//новый пиксел

SetArrPixel( e, Xs + 1, x, Ys-y, PictArrs[Num]);

end;

Пример полной программной реализации приведён в приложении А

9.9 Создание негатива

Создание негатива также является базовым эффектом. Он может быть полезен при сканировании цветных слайдов. В основе этого метода лежит логическое отрицание значения каждого пиксела изображения.

Пример(создание негатива изображения):

for y := 0 to Ys do

for x := 0 to Xs do begin

t := GetArrPixel(Xs + 1 , x, Ys-y, PictArrs[Num]);

asm

mov eax,t

not eax

mov e,eax

end;

SetArrPixel( e, Xs + 1, x, Ys-y, PictArrs[Num]);

end;

Пример полной программной реализации приведён в приложении А

9.10 Логические операции над изображениями

Изображения можно складывать, вычитать, умножать на константу и вообще выполнять все логические операции применимые к числам.

Логическое сложение изображенией изображений производится сложением каждой компоненты цветовых координат, т.е. приизводится разложение изображений по базису R G B и затем над каждой компонентой i,j кординаты R первого изображения и соответствующей компонентой координаты R второго изображения призводится операция or.

Логическое умножение изображений производится объединением соответствующих компонент цветовых проскостей R G B оператором and

Логическое умножение по модулю 2 изображений производится объединением соответствующих компонент цветовых проскостей R G B оператором xor

Подобным образом можно производить следующие операции над изображениями sub, mul, imul, div, idiv, nand, nxor, nor ….

9.11 Фильтрация изображений

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

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

Будем рассматривать фильтры в виде квадратной матрицы A. Пусть исходное изображение X, а получаемое как результат фильтрации - Y. Для простоты будем использовать матрицы 3x3:

Рекурсивными фильтрами первого рода будут такие фильтры, выход Y которых формируется перемножением весовых множителей A с элементами изображения X. Фильтром низких частот пользуются часто для того, чтобы подавить шум в изображении, сделать его менее резким. Высокочастотные фильтры, напротив используются для подчеркивания резкости изображения.

Пример программной реализации фильтрации матричными линейными фильтрами приведён в приложении А.