Дискретизация. Антиалиасинг. Геометрические преобразования растровых изображений
Разложение преобразований в композицию более простых
В некоторых случаях имеет смысл раскладывать сложное преобразование в последовательность более простых, для которых существуют эффективные алгоритмы.
Самый простой и полезный пример - представление общего преобразования T в виде композиции преобразований по столбцам и по строкам. Преобразования, сохраняющие столбцы или строки, можно эффективно распараллелить (по столбцам и строкам соответственно).
Пусть , где C сохраняет столбцы, а R - строки. Пусть
, а промежуточный результат -
. Тогда
![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) .](/sites/default/files/tex_cache/ec837d8a2bcb91dd1d69b404c0a011d0.png)
Отсюда получаем, что
![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) .](/sites/default/files/tex_cache/90c3ec8ad9adb681ce153ce8f82fe54d.png)
Таким образом, c2(x, y) = t2(x, y) и r1(x, t2(x, y)) = t1(x, y). Для того, чтобы найти r1, надо в выражении t1 вычленить все подвыражения, содержащие y, и привести их к виду t2(x, y). После этого, заменив эти подвыражения на y, получим выражение для r1.
Рассмотрим эту процедуру на примере поворота на угол :
![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) .](/sites/default/files/tex_cache/c7c81343f1c79c38d694ea873fbb7134.png)
Тогда
![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,](/sites/default/files/tex_cache/00be11912bca590e7598b64fc3215734.png)
тогда (это, конечно, возможно, когда
. Отсюда
![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).](/sites/default/files/tex_cache/e6a1fa4ae2cb6c847128c2b6938893ef.png)
Получаем, что . Итак, получено следующее разложение (наглядно на рис. 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)}](/sites/default/files/tex_cache/80a86b023f0c2a5c2963ef966bf1e3d0.png)
В вырожденном случае ( ) такое разложение не получится, но в этом случае всё T сведется к замене x на y и возможному отражению (когда
). Следует также отметить, что вращений на углы
, близких к
, следует избегать, т.к. при их применении произойдут слишком большие искажения по вертикали (слишком сильное сжатие). В этом случае корректнее произвести поворот сначала на
, а затем
уже на
(знак соответствует близкому к
углу). Преобразования C и R представляют собой композицию сжатия и скоса по вертикали и горизонтали соответственно. Поэтому данная декомпозиция позволяет реализовать поворот с помощью нескольких последовательных применений алгоритма Веймана для скосов и масштабирования.
Существует альтернативное разложение на 3 скоса для матрицы поворота (наглядно на рис. 7.21), которое позволяет избавиться от существенных искажений при , присущих вышеизложенному алгоритму:
![\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)](/sites/default/files/tex_cache/d991fcb6d59132138a6f98e275b9b6b8.png)
Алгоритм Веймана рекомендуется применять именно вместе с таким разложением.
7.4. Заключение
Тема дискретизации, представления и обработки изображений (англ. image processing) является самостоятельной научной дисциплиной. Более подробно с ней можно ознакомиться по книгам [44], [32], [9]. Тема геометрических преобразований подробно раскрыта в книге [52].