介绍
图像的几何空间变换可以改进图像中像素间的空间关系,主要由两个基本操作组成:
- 坐标空间的变换。
- 图像内插,对空间变换后的像素赋值。
空间坐标变换
可由下式表示:
$$(x, y) = T{(v, w)}$$
上式中$(v, w)$是原图中像素的坐标,$(x, y)$是变换后图像的坐标,$T$是变换函数,也就是原图中某个位置的像素通过变换函数,映射到目标图像中。比如:$(x, y) = T{(v, w)} = (v/2, w/2)$表示在两个方向上将原图缩小一半。
图像内插
请参考我的另一篇博文图像内插。
仿射变换
仿射变换是最常用的空间坐标变换之一,其一般形式如下:
$$
\left[\begin{matrix} x & y & 1 \end{matrix}\right] =
\left[\begin{matrix} v & w & 1 \end{matrix}\right]T =
\left[\begin{matrix} v & w & 1 \end{matrix}\right]
\left[\begin{matrix}
t_{11} & t_{12} & 0 \\
t_{21} & t_{22} & 0 \\
t_{31} & t_{32} & 1
\end{matrix}\right]
$$
上式中,$T$表示变换矩阵,可根据$T$中元素所选择的值,对一组坐标点做尺度、旋转、平移或偏移。
变换名称 | 变换矩阵$T$ | 坐标公式 | 例子 |
---|---|---|---|
恒等变换 | $\left[\begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{matrix}\right]$ | $x = v \\ y = w$ | |
尺度变换 | $\left[\begin{matrix} c_x & 0 & 0 \\ 0 & c_y & 0 \\ 0 & 0 & 1\end{matrix}\right]$ | $x = c_x v \\ y = c_y w$ | |
平移变换 | $\left[\begin{matrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ t_x & t_y & 1\end{matrix}\right]$ | $x = v + t_x \\ y = w + t_y$ | |
旋转变换 | $\left[\begin{matrix} \cos\theta & \sin\theta & 0 \\ -\sin\theta & \cos\theta & 0 \\ 0 & 0 & 1\end{matrix}\right]$ | $x = v\cos\theta - w\sin\theta \\ y = v\sin\theta + w\cos\theta$ | |
垂直偏移变换 | $\left[\begin{matrix} 1 & s_h & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1\end{matrix}\right]$ | $x = v \\ y = w + s_hv$ | |
水平偏移变换 | $\left[\begin{matrix} 1 & 0 & 0 \\ s_v & 1 & 0 \\ 0 & 0 & 1\end{matrix}\right]$ | $x = v + s_vw \\ y = w$ |
实现
实现空间变换的方法有两种:
- 前向映射:整体思想是扫描原图像,对于原图像上的每个像素,根据它在原图中的坐标$(v, w)$,利用$(x, y) = T{(v, w)}$计算其在目标图像上的坐标$(x, y)$,然后将原图中坐标为$(v, w)$的像素值赋值给目标图像中坐标为$(x, y)$的像素。
- 反向映射:整体思想是扫描目标图像的每个像素,对于坐标为$(x, y)$的像素,利用$(v, w) = T^{-1}{(x, y)}$计算其在原图像上的坐标$(v, w)$,然后用内插的方法计算该像素的值。
这里$T^{-1}$表示变换函数的反函数,对于仿射变换来说,相当于$\left[\begin{matrix} x & y & 1 \end{matrix}\right]$乘变换矩阵的逆矩阵。
使用前向映射可能会存在两个问题,一个是原图像中多个像素被变换到目标图像的同一个位置,产生冲突,另一个问题是计算出的目标像素坐标不存在,比如不是个整数坐标。而反向映射不存在这两个问题,因此反向映射用的多一点。
这里给出用反向映射实现仿射变换的C++代码,代码用的是opencv库处理图像。
1 |
|