Предисловие
Данное учебное пособие посвящено основным методам и алгоритмам, применяющимся в различных областях растровой компьютерной графики. Объединяющим элементом для рассматриваемых в книге идей является понятие растра или, иными словами, цифрового изображения, включая изображение на мониторе Вашего домашнего компьютера. С большинством изложенных алгоритмов Вы, хотя и не замечая этого, сталкиваетесь каждодневно - ведь компьютер используется повсеместно для решения Ваших как бытовых, так и профессиональных проблем, а его монитор служит практически единственным средством отображения различного рода информации.
В первой части книги, после введения в такие понятия, как растр и цвет (как ни странно, кажущееся простым понятие "цвет" требует достаточно нетривиальных подходов при его описании в компьютере), дается обзор современных аппаратных средств растровой графики, включая цифровые мониторы, камеры, сканеры, принтеры и т.п. Кроме того, рассматривается структура графической подсистемы персонального компьютера как системы, непосредственно отвечающей за то, что окажется на экране Вашего монитора.
Несколько глав далее посвящены алгоритмам растеризации или, иными словами, рисования различного рода линейных объектов, начиная с простых, таких как отрезки, окружности и эллипсы, и заканчивая сложными, такими как параметрические кривые, включая кривые Безье и сплайны на их основе.
Далее рассматриваются алгоритмы заполнения многоугольников и областей произвольной формы, а также некоторые методы отсечения отрезков и многоугольников другими многоугольниками, что предполагает анализ взаимного расположения точек, отрезков и областей на плоскости.
Большое внимание в книге уделяется различным алгоритмам обработки цифровых изображений, например, фотографий. Так, подробно рассматриваются способы осуществления различных геометрических преобразований над изображениями на плоскости и алгоритмы фильтрации изображений, например с целью удаления шумов или повышения контраста, а также методы поиска границ на основе градиента и лапласиана. Отдельная глава в книге посвящена методам выделения объектов из общего фона изображения, включая такие алгоритмы, как "Волшебная палочка" и "Умные ножницы", а также современный метод сегментации изображений при помощи разрезов на графах.
В условиях определенных аппаратных ограничений в части передачи цветов важную роль играют методы подмены одного способа описания цвета другим. Например, если Вы хотите распечатать полутоновое изображение, скажем, фотографию на черно-белом принтере, то Вы не обойдетесь без алгоритмов псевдотонирования, рассматриваемых в данной книге. Также для многих задач важно иметь возможность заменить 24 бита, хранимых в каждом пикселе цветного изображения, на 8 бит, не внося существенных визуальных искажений, - это можно сделать с использованием приведенных методов квантования.
Заключительная часть книги посвящена крайне актуальным вопросам уменьшения объема данных, представляющих растровое изображение, или, как их часто называют в обиходе, вопросам "сжатия" изображений. В случае необходимости сохранить изображение в оригинальном виде (это важно, например, для медицинских или спутниковых изображений) используются методы сжатия данных без потерь, основанные на анализе повторений элементов или целых последовательностей, неравномерности гистограммы распределения цветов. Однако, если Вы готовы пожертвовать незначительными, часто не видимыми "невооруженным" глазом, искажениями в пользу многократного уменьшения объема требуемого места на диске, скажем, для Вашей коллекции фотографий, то тогда Вам подойдут алгоритмы сжатия изображений с потерей данных, такие как косинусное или вейвлет преобразования, используемые в JPEG.
Изложенный в данной книге материал апробирован многолетней практикой его преподавания в рамках специального курса лекций "Алгоритмические основы машинной графики", читаемого авторами на Механико-математическом факультете МГУ для студентов I-V курса и аспирантов. Надеемся, что приведенные в этом пособии идеи будут полезны широкому кругу специалистов, - как начинающих изучение, так и активно практикующих в своей работе алгоритмы растровой компьютерной графики.
О записи алгоритмов
Алгоритмы в книге записываются на псевдокоде с синтаксисом напоминающим объектно-ориентированные языки семейства C (такие как C++, C#, Java ). Основные управляющие конструкции:
- {действие1 ; действие2 ; . . . действиеN} - составное действие: выполнять последовательно действие1, затем действие2, . . . действиеN.
- if(условие) действие - если условие выполнено, то выполнить действие (возможно составное).
- if(условие) действие1 else действие2 - если условие выполнено, то выполнить действие1 (возможно составное), в противном случае выполнить действие2 (возможно составное).
- while(условие) действие - Цикл: если условие выполнено, то выполнить действие (возможно составное), затем снова вернуться к началу цикла.
- do действие while(условие); - Цикл: выполнить действие (возможно составное), затем, если условие выполнено, то вернуться к началу цикла.
- for(действие1 ; условие; действие2 ) действие - Цикл: удобная форма записи, эквивалентная действие1; while(условие) { действие; действие2 ; }.
- foreach(элемент in множество) действие - Цикл: действие выполняется последовательно для каждого элемента из множества. При этом в действии могут производиться манипуляции с текущим элементом.
- break - выйти из цикла.
- continue - перейти на следующую итерацию цикла.
- ИмяФункции(аргумент1 , аргумент2 , . . . аргументN) - вызов функции с именем ИмяФункции и аргументами аргумент1, аргумент2, . . . аргументN.
- Объект.ИмяМетода(аргумент1 , аргумент2 , . . . аргументN) - вызов метода с именем ИмяМетода и аргументами аргумент1, аргумент2, . . . аргументN для объекта.
- return значение - выйти из функции, возвратив значение.