Московский государственный университет имени М.В.Ломоносова
Опубликован: 23.04.2007 | Доступ: свободный | Студентов: 3275 / 437 | Оценка: 4.18 / 3.71 | Длительность: 17:54:00
ISBN: 978-5-9556-0098-7
Специальности: Программист
Лекция 7:

Дискретизация. Антиалиасинг. Геометрические преобразования растровых изображений

Разложение преобразований в композицию более простых

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

Самый простой и полезный пример - представление общего преобразования T в виде композиции преобразований по столбцам и по строкам. Преобразования, сохраняющие столбцы или строки, можно эффективно распараллелить (по столбцам и строкам соответственно).

Пусть T = R \circ C, где C сохраняет столбцы, а R - строки. Пусть T \colon (x, y) \mapsto (x'', y''), а промежуточный результат - (x', y') (C \colon (x, y) \mapsto (x', y'), R \colon (x', y') \mapsto (x'', y'')). Тогда

T = \left( \begin{array}{c} 
t_1(x, y) \\ 
t_2(x, y) 
\end{array} \right);   C = \left( \begin{array}{c} 
x \\ 
c_2(x, y)
\end{array} \right);   R = \left( \begin{array}{c} 
 r_1(x', y') \\ 
y' 
\end{array} \right) .

Отсюда получаем, что

T = \left( \begin{array}{c} 
t_1(x, y) \\ 
t_2(x, y) 
\end{array} \right) = \left( \begin{array}{c} 
r_1(x, c_2(x, y)) \\ 
c_2(x, y)
\end{array} \right) .

Таким образом, c2(x, y) = t2(x, y) и r1(x, t2(x, y)) = t1(x, y). Для того, чтобы найти r1, надо в выражении t1 вычленить все подвыражения, содержащие y, и привести их к виду t2(x, y). После этого, заменив эти подвыражения на y, получим выражение для r1.

Рассмотрим эту процедуру на примере поворота на угол \theta:

T(x, y) = \left( \begin{array}{cc} 
\cos \theta & -\sin \theta \\ 
\sin \theta & \cos \theta  
\end{array} \right) \left( \begin{array}{c} 
x \\ 
y 
\end{array} \right) .

Тогда

t_1(x, y) = \cos \theta \cdot x - \sin \theta \cdot y, \\
c_2(x, y) = t_2(x, y) = \sin \theta \cdot x + \cos \theta \cdot y,

тогда y = (t_2(x, y) - \sin \theta \cdot x)/ \cos \theta (это, конечно, возможно, когда \theta \ne \pm 90^{\circ}). Отсюда

t_1(x, y) = \cos \theta \cdot x - \sin \theta \cdot \left(\frac{t_2(x, y) - \sin \theta \cdot x)}{\cos \theta} \right) \\
= \sec \theta \cdot x - \tan \theta \cdot t_2(x, y).

Получаем, что r_1(x, y) = \sec \theta \cdot x - \tan \theta \cdot y. Итак, получено следующее разложение (наглядно на рис. 7.20):

\stackrel{T}{\left( \begin{array}{cc} 
\cos \theta & -\sin \theta \\ 
\sin \theta & \cos \theta  
\end{array} \right)} = \stackrel{R}{ \left( \begin{array}{cc} 
\sec \theta & - \tan \theta \\ 
0 & 1  
\end{array} \right)} \cdot \stackrel{C}{ \left( \begin{array}{cc} 
1 & 0 \\ 
\sin \theta & \cos \theta  
\end{array} \right)}

В вырожденном случае ( \theta = \pm 90^{\circ} ) такое разложение не получится, но в этом случае всё T сведется к замене x на y и возможному отражению (когда \theta = -90^{\circ} ). Следует также отметить, что вращений на углы \theta, близких к \pm 90^{\circ}, следует избегать, т.к. при их применении произойдут слишком большие искажения по вертикали (слишком сильное сжатие). В этом случае корректнее произвести поворот сначала на \pm 90^{\circ}, а затем уже на \theta - (\pm 90^{\circ}) (знак соответствует близкому к \theta углу). Преобразования C и R представляют собой композицию сжатия и скоса по вертикали и горизонтали соответственно. Поэтому данная декомпозиция позволяет реализовать поворот с помощью нескольких последовательных применений алгоритма Веймана для скосов и масштабирования.

Разложение вращения на скос и смещение по вертикали (C), а затем по горизонтали (R).

Рис. 7.20. Разложение вращения на скос и смещение по вертикали (C), а затем по горизонтали (R).

Существует альтернативное разложение на 3 скоса для матрицы поворота (наглядно на рис. 7.21), которое позволяет избавиться от существенных искажений при \theta  \approx \pm 90^{\circ}, присущих вышеизложенному алгоритму:

\left( \begin{array}{cc} 
\cos \theta & -\sin \theta \\ 
\sin \theta & \cos \theta  
\end{array} \right) = \left( \begin{array}{cc} 
1 & - \tan {\frac{\theta}{2}} \\ 
0 & 1  
\end{array} \right) \left( \begin{array}{cc} 
1 & 0 \\ 
\sin \theta & 1   
\end{array} \right)  \left( \begin{array}{cc} 
1 & - \tan {\frac{\theta}{2}} \\ 
0 & 1  
\end{array} \right)
Разложение вращения на 3 скоса.

Рис. 7.21. Разложение вращения на 3 скоса.

Алгоритм Веймана рекомендуется применять именно вместе с таким разложением.

7.4. Заключение

Тема дискретизации, представления и обработки изображений (англ. image processing) является самостоятельной научной дисциплиной. Более подробно с ней можно ознакомиться по книгам [44], [32], [9]. Тема геометрических преобразований подробно раскрыта в книге [52].