Масштабирование изображения
Масштабирование изображения позволяет сжать или растянуть его по горизонтали и/или вертикали. При этом изменяется ширина и/или высота изображения. Для масштабирования задаются масштабные коэффициенты – то, насколько нужно сжать/растянуть изображение по горизонтали или вертикали. Масштабные коэффициенты могут задаваться в нормализованной, процентной или непосредственной форме. В нормализованной форме за единицу принимаются размеры исходного изображения. Значения меньше единицы указывают на сжатие изображения, значения больше единицы – на растяжение. В процентной форме нормализованные значения умножаются на 100 %. В непосредственной форме новые размеры по горизонтали и вертикали задаются в виде количества пикселей по тому или другому измерению.
Возникает вопрос о том, каким образом определять цвета при изменении размеров изображения. Существует два основных подхода к этой проблеме:
1. Цвет пикселя в масштабированном изображении принимается равным цвету ближайшего к нему пикселя исходного изображения.
2. Использование интерполяции. В этом случае цвет пикселя масштабируемого изображения вычисляется, как значение некоторой интерполирующей функции от цветов соседних пикселей в исходном изображении.
При использовании билинейной интерполяции цвет вычисляется, как взвешенная сумма ближайших четырёх пикселей исходного изображения (при увеличении) или как взвешенная сумма группы пикселей (при уменьшении).
Первый подход достаточно прост, но не всегда даёт приемлемое качество обработанного изображения. Например, если новый размер намного больше старого, то возникает блочная структура изображения, т. е. каждый пиксель исходного изображения соответствует квадратной области пикселей одного и того же цвета в обработанном изображении. Эта аномалия представлена на рис. 2.15.
С другой стороны, если новый размер намного меньше старого, то при масштабировании одному пикселю обработанного изображения соответствует группа пикселей исходного изображения, причём в процессе масштабирования фактически выбирается случайный пиксель из этой группы.
Рис. 2.15. Некорректное увеличение
Подход, использующий интерполяцию, позволяет достичь более высокого качества изображения, но более сложен в реализации. Обычно используется билинейная или бикубическая интерполяция. Бикубическая интерполяция позволяет получить изображение с более высоким качеством, чем билинейная интерполяция. Однако следует заметить, что при дальнейшем повышении порядка интерполяции качество получаемого изображения может улучшаться незначительно.
Приведем простейшую формулу, которая позволяет определить ближайший пиксель исходного изображения (без использования интерполяции):
Параметр W определяет размер изображения по горизонтали, измеряемый в пикселях. Параметр H определяет размер по вертикали. Параметры i и j определяют соответственно строку и столбец матрицы изображения и изменяются в пределах высоты и ширины изображения соответственно.
15.Алгоритмы трёхмерного отсечения.
Прямоугольный параллелепипед
Усеченная пирамида
n Отсечение выпуклой многоугольной областью
n Выпуклый многоугольник = пересечение полуплоскостей, образованных сторонами многоугольной области
Алгоритм Сазерленда-Ходгмана
{ p[1..n] – многоугольник, sp – полуплоскость, inp(p,sp) – лежит ли точка p в полуплоскости sp, add – добавление вершины в новый многоугольник }
p[0]:=p[n]; ci := inp(p[n],sp);
for i:=1 to n do begin
nci := inp(p[i],sp);
if nci <> ci then begin
newp:=intersect(p[i-1],p[i],sp);
add(newp);
end;
if nci then add(p[i]);
ci := nci;
end;
В результате отсечения получится многоугольник.
Проверка принадлежности полупространству
Нахождение отсечения на битовом уровне.
Прежде чем заняться обобщением изложенных методов для случая трех измерений, необходимо обсудить вопрос о форме отсекающего объема. Двумя наиболее распространенными формами трехмерных отсекателей являются: прямоугольный параллелепипед, т. е. полый брусок, используемый при параллельном или аксонометрическом проецировании, а также усеченная пирамида, часто называемая пирамидой видимости, которая используется при центральном проецировании. Эти формы показаны на рис.9.8, у каждой из них шесть граней: левая, правая, верхняя, нижняя, ближняя и дальняя. Существует, кроме того, необходимость отсекать и по нестандартным объемам.
Как и при двумерном отсечении, отрезки, которые полностью видимы или тривиально невидимы, можно идентифицировать с использованием обобщения кодов концевых точек Коэна-Сазерленда. В трехмерном случае используется 6-битовый код. Вновь самый правый бит кода считается первым. В биты кода заносятся единицы с помощью обобщения двумерной процедуры. Конкретно единица заносится:
в первый бит - если конец ребра левее объема,
во второй бит - если конец ребра правее объема,
в третий бит - если конец ребра ниже объема,
в четвертый бит - если конец ребра выше объема,
в пятый бит - если конец ребра ближе объема,
в шестой бит - если конец ребра дальше объема.
Рис 9.8 Трехмерное отсечение
В противном случае в соответствующие биты заносятся нули. И опять, если коды обоих концов отрезка равны нулю, то оба конца видимы и отрезок тоже будет полностью видимым. Точно так же, если побитовое логическое произведение кодов концов отрезка не равно нулю, то он полностью невидим. Если же это логическое произведение равно нулю, то отрезок может оказаться как частично видимым, так и полностью невидимым. В этом случае необходимо определять пересечения отрезка с гранями отсекающего объема.
Поиск кодов точки относительно отсекающего прямоугольного параллелепипеда является прямым обобщением соответствующего двумерного алгоритма. Однако случай, когда отсекателем служит усеченная пирамида, показанная на рис.9.8.b, заслуживает дополнительного обсуждения. Один из методов заключается в преобразовании отсекателя в каноническую форму, где xправ = 1, xлев = -1, yверх = 1, yниз = -1 при zдаль = 1. Если zближ = a, где 0 < a <= 1, а центр проекции совпадает с началом левой системы координат, то проверка кодов концевых точек заметно упрощается.
В более естественном методе, меньше искажающем форму отсекателя, отрезок, соединяющий центр проекции с центром усеченной пирамиды, совмещается с осью z правой системы координат, как это показано на рис.9.8,Ь.
Вид усеченной пирамиды сверху показан на рис. 9.9. а. Уравнение прямой на плоскости xz, несущей проекцию правой грани отсекателя, имеет вид:
x = (z - zцп) * xп / (zд - zцп) = za 1 + a 2,
где a 1 = xп / (zд - zцп) и a 2 = - a 1 zцп
Рис 9.9 Усеченная пирамида
Уравнение этой прямой можно использовать для определения местоположения точки: справа, на или слева от прямой, т. е. вне отсекателя, на плоскости, несущей его правую грань, или внутри отсекателя. Подстановка координат х и z точки Р в пробную функцию правой грани дает следующий результат:
│ п = x - za 1 - a 2 м > 0, если Р справа от плоскости
н = 0, если Р на плоскости
о < 0, если Р слева от плоскости
Пробные функции для левой, верхней и нижней граней имеют вид:
│ л = zb 1 - b 2 м > 0, если Р справа от плоскости
н = 0, если Р на плоскости
о < 0, если Р слева от плоскости
где b 1 = xл / (zд - zцп) и b 2 = - b 1 zцп
│ в = y - zg 1 - g 2 м > 0, если Р выше плоскости
н = 0, если Р на плоскости
о < 0, если Р ниже плоскости
где g 1 = yв / (zд - zцп) и g 2 = - g 1 zцп
│ н = y - zd 1 - d 2 м > 0, если Р ниже плоскости
н = 0, если Р на плоскости
о < 0, если Р выше плоскости
где d 1 = yн / (zд - zцп) и d 2 = - d 1 zцп
Наконец, пробные функции для ближней и дальней граней имеют вид:
│ б = z - zб м > 0, если Р ближе плоскости
н = 0, если Р на плоскости
о < 0, если Р дальше плоскости
│ д = z - zд м > 0, если Р дальше плоскости
н = 0, если Р на плоскости
о < 0, если Р ближе плоскости
Чем ближе zцп к бесконечности, тем больше форма отсекателя приближается к прямоугольному параллелепипеду. Пробные функции при этом тоже приближаются к соответствующим пробным функциям прямоугольного параллелепипеда.
Как указывали Лианг и Барский, последний метод может дать некорректные значения кодов, если концы отрезка лежат за центром проекции. Это происходит потому, что плоскости, несущие левую, правую, верхнюю и нижнюю грани усеченной пирамиды, пересекаются в точке центра проекции. Поэтому существуют точки, расположенные одновременно левее левой и правее правой граней. Лианг и Барский предложили способ устранения этой неопределенности. Для этого в принципе необходимо лишь обратить значения первых четырех битов кода при z > zцп.
http://www.mari-el.ru/mmlab/home/kg/Lection9/index.html
16. Алгоритм плавающего горизонта.
Из презентации:
Удаление невидимых линий трёхмерного представления функции, описывающих поверхность в виде F(x, y, z) = 0
n Изображение поверхности сводится к изображению последовательности секущих при постоянных значениях z.
n F(x, y, z) = 0 приводится к виду y=f(x,z) или x=g(y,z)
n Удаление невидимой линии:
n Если для текущего значения z, при некотором x значение y больше значений y для всех предыдущих кривых при том же x, то текущая кривая видима в точке (x, y), иначе – не видима.
n Добавляется «нижний» горизонт
n Плавающий горизонт – два массива (по значениям x), задающих минимальное и максимальное значения y при различных z.
n Зазубренные боковые рёбра. Чтобы их избежать, добавляют мнимые боковые рёбра
Алгоритм Робертса
На входе – n тел. Требуется отрисовать их с удалением невидимых линий
- Определение нелицевых граней для каждого тела. Из каждого тела удаляются те рёбра и грани, которые экранируются самим телом.
- Определение и удаление невидимых рёбер. Каждое из видимых рёбер каждого тела сравнивается с каждым из оставшихся тел для выделения видимой части.
n Сложность алгоритма растёт как квадрат от количества тел.
n Работает в объектном пространстве.
n Требуется, чтобы все тела были выпуклы.
n Тело представляется набором плоскостей – своих граней.
n Грани задаются коэффициентами уравнения a x + b y + c z + d = 0.
n Всё тело – матрицей размера 4 x n.
Алгоритм Кэтмула
n Работает в пространстве изображения.
n Использует z-буфер.
Далее из интернета:
Алгоритм плавающего горизонта можно отнести к классу алгоритмов, работающих в пространстве изображения. Алгоритм плавающего горизонта чаше всего используется для удаления невидимых линий трехмерного представления функций, описывающих поверхность в виде
F(x, у, z) = 0.
Подобные функции возникают во многих приложениях в математике, технике, естественных науках и других дисциплинах.
Главная идея данного метода заключается в сведении трехмерной задачи к двумерной путем пересечения исходной поверхности последовательностью параллельных секущих плоскостей, имеющих постоянные значения координат х, у или z.
На рис. 5.2. приведен пример, где указанные параллельные плоскости определяются постоянными значениями z. Функция F(x,у,z) = 0 сводится к последовательности кривых, лежащих в каждой из этих параллельных плоскостей, например к последовательности у=f(x,z) или х=g(у,z), где z постоянно на каждой из заданных параллельных плоскостей.
Рис. 5.2. Секущие плоскости с постоянной координатой
Итак, поверхность теперь складывается из последовательности кривых, лежащих в каждой из этих плоскостей, как показано на рис. 5.3.
Рис. 5.3. Секущие плоскости с постоянной координатой
Алгоритм сначала упорядочивает плоскости z = const по возрастанию расстояния до них от точки наблюдения. Затем для каждой плоскости, начиная с ближайшей к точке наблюдения, строится кривая, лежащая на ней, т. е. для каждого значения координаты х в пространстве изображения определяется соответствующее значение y. Алгоритм удаления невидимой линии заключается в следующем.
Если на текущей плоскости при некотором заданном значении x соответствующее значение у на кривой больше значения y для всех предыдущих кривых при этом значении x, то текущая кривая видима в этой точке; в противном случае она невидима.
Невидимые участки показаны пунктиром на рис. 5.4. Реализация данного алгоритма достаточно проста. Для хранения максимальных значений y при каждом значении x используется массив, длина которого равна числу различимых точек (разрешению) по оси x в пространстве изображения. Значения, хранящиеся в этом массиве, представляют собой текущие значения "горизонта". Поэтому по мере рисования каждой очередной кривой этот горизонт "всплывает". Фактически этот алгоритм удаления невидимых линий работает каждый раз с одной линией.
Алгоритм работает очень хорошо до тех пор, пока какая-нибудь очередная кривая не окажется ниже самой первой из кривых, как показано на рис. 5.5., а.
Рис. 5.5. Обработка нижней стороны поверхности
Подобные кривые, естественно, видимы и представляют собой нижнюю сторону исходной поверхности, однако алгоритм будет считать их невидимыми. Нижняя сторона поверхности делается видимой, если модифицировать этот алгоритм, включив в него нижний горизонт, который опускается вниз по ходу работы алгоритма. Это реализуется при помощи второго массива, длина которого равна числу различимых точек по оси x в пространстве изображения. Этот массив содержит наименьшие значения y для каждого значения x. Алгоритм теперь становится таким: если на текущей плоскости при некотором заданном значении x соответствующее значение y на кривой больше максимума или меньше минимума по y для всех предыдущих кривых при этом значении x, то текущая кривая видима. В противном случае она невидима.
Полученный результат показан на рис. 5.5., б.
В изложенном алгоритме предполагается, что значение функции, т. е. y, известно для каждого значения x в пространстве изображения. Однако если для каждого значения х нельзя указать (вычислить) соответствующее ему значение y, то невозможно поддерживать массивы верхнего и нижнего плавающих горизонтов. В таком случае используется линейная интерполяция значений y между известными значениями для того, чтобы заполнить массивы верхнего и нижнего плавающих горизонтов.
Изложенный алгоритм приводит к некоторым дефектам, когда кривая, лежащая в одной из более удаленных от точки наблюдения плоскостей, появляется слева или справа из-под множества кривых, лежащих в плоскостях, которые ближе к указанной точке наблюдения. Этот эффект продемонстрирован на рис. 5.6., где уже обработанные плоскости n-1 и n расположены ближе к точке наблюдения. На рисунке показано, что получается при обработке плоскости n+1. После обработки кривых n-1 и n верхний горизонт для значений x = 0 и x = 1 равен начальному значению y; для значений x от 2 до 17 он равен ординатам кривой n; а для значений 18, 19, 20 - ординатам кривой n-1. Нижний горизонт для значений x = 0 и x = 1 равен начальному значению y; для значений x = 2, 3, 4 - ординатам кривой n; а для значений x от 5 до 20 - ординатам кривой n-1. При обработке текущей кривой (n+1) алгоритм объявляет ее видимой при x = 4. Это показано сплошной линией на рис. 5.6. Аналогичный эффект возникает и справа при х = 18. Такой эффект приводит к появлению зазубренных боковых ребер. Проблема с зазубренностью боковых ребер решается включением в массивы верхнего и нижнего горизонтов ординат, соответствующих штриховым линиям на рис. 5.6. Это можно выполнить эффективно, создав ложные боковые ребра.
Рис. 5.6. Эффект зазубренного ребра
Если функция содержит очень острые участки (пики), то приведенный алгоритм также может дать некорректные результаты. Этот эффект вызван вычислением значений функции и оценкой ее видимости на участках, меньших, чем разрешающая способность экрана, т. е. тем, что функция задана слишком малым количеством точек. Если встречаются узкие участки, то функцию следует вычислять в большем числе точек.
Вариант 2 ответа на вопрос
Рассмотрим задачу построения графика функций двух переменных z=f(x,y) в виде сетки координатных линий x=const и y=const.
Заметим, что каждая линия семейства z=f(x,yi) лежит в своей плоскости y=yi, причем эти плоскости параллельны и, следовательно, не пересекаются. Поэтому при yj>yiлиния z=f(x,yj) не может закрывать линию z=f(x,yi).
Тогда возможен следующий алгоритм построения графика функции z=f(x,y):
Линии рисуются в порядке удаления (возрастания по y) и при рисовании очередной линии рисуется только та ее часть, которая не закрывается ранее нарисованными линиями. Такой алгоритм называется методом плавающего горизонта.
Для определения частей линии z=f(x,yk), которые не закрывают ранее нарисованные линии, вводятся линии горизонта или контурные линии.
Пусть проекцией линии z=f(x,yk) на картинную плоскость является линия Y=Yk(X), где (X,Y) – координаты на картинной плоскости. Контурные линии Ykmax(X) и Ykmin(X)определяются следующими соотношениями:
· Ykmax(X)=max Yi(X),
· Ykmin(X)=min Yi(X), где 1<=k<=k-1
На экране рисуются только те части линии Y=Yk(X), которые находятся выше линии Ykmax(X) или ниже линии Ykmin(X).
Одной из наиболее простых и эффективных реализации данного метода является растровая реализация, при которой в области задания вводится сетка
{ (xj,yj), i=1, , ni }
и каждая из линий Y=Yk(X) представляется в виде ломаной. Для рисования сегментов этой ломаной используется модифицированный алгоритм Брезенхейма, который перед выводом очередного пиксела сравнивает его ординату с верхней и нижними контурными линиями, представляющими в этом случае массивы значений ординат.
17.Двумерные и трёхмерные преобразования тел
Из презентации:
Двумерные преобразования
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|