I have to remind myself that some birds don’t mean to be caged . Their feathers are just too bright. And when they fly away, the part of you that knows it was a sin to lock them up. DOES rejoice. Still, the place you live in is that much more drab and empty that they’re gone. I guess I just miss my friend. ——《肖申克的救赎》
几何变换,又称空间变换,是图形处理的一个方面,是各种图形处理算法的基础。它将一幅图像中的坐标位置映射到另一幅图像中的新坐标位置,其实质是改变像素的空间位置,估算新空间位置上的像素值。几何变换算法一般包括空间变换运算和插值算法。
几何变换不改变图像的像素值, 只是在图像平面上进行像素的重新安排。适当的几何变换可以最大程度地消除由于成像角度、透视关系乃至镜头自身原因所造成的几何失真所产生的负面影响。几何变换常常作为图像处理应用的预处理步骤, 是图像归一化的核心工作之一。
一个几何变换需要两部分运算:首先是空间变换所需的运算, 如平移、缩放、旋转和正平行投影等, 需要用它来表示输出图像与输入图像之间的(像素)映射关系;此外,还需要使用灰度插值算法, 因为按照这种变换关系进行计算, 输出图像的像素可能被映射到输入图像的非整数坐标上。
基础概念 | 说明 |
---|---|
图像的几何变换 | 指用数学建模的方法来描述图像的位置、大小、形状等变换。 |
几何变换的内容 | 图像的空间平移、比例缩放、旋转、仿射变换和图像插值。 |
几何变换的实质 | 改变像素的空间位置。 |
( x , y ) = T { ( u , v ) } (x, y) = T\{(u, v)\} (x,y)=T{(u,v)}
[ x y 1 ] = [ x 0 y 0 1 ] T { \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}^T [xy1]=[x0y01]T
[ x y 1 ] = [ x 0 y 0 1 ] T { \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}^T [xy1]=[x0y01]T
T = [ a b p c d q m n s ] T=\left[ \begin{array}{ccc} a & b & p\\ c & d & q\\ m & n & s \end{array} \right ] T=⎣⎡acmbdnpqs⎦⎤
平移变换
{ x = x 0 + Δ x ( x 0 , y 0 ) 为平移之前的像素坐标 y = y 0 + Δ y ( x , y ) 为 对 应 像 素 平 移 后 的 坐 标 \begin{cases} x=x_0+\Delta x & \text{$(x_0, y_0)$为平移之前的像素坐标}\\ y=y_0+\Delta y & \text{$(x, y)为对应像素平移后的坐标$} \end{cases} {x=x0+Δxy=y0+Δy(x0,y0)为平移之前的像素坐标(x,y)为对应像素平移后的坐标
[ x y 1 ] = [ x 0 y 0 1 ] × [ 1 0 0 0 1 0 Δ x Δ y 1 ] { \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}\times{ \left[\begin{array}{ccc} 1 & 0 & 0\\ 0 & 1 & 0\\ \Delta x & \Delta y & 1 \end{array} \right ]} [xy1]=[x0y01]×⎣⎡10Δx01Δy001⎦⎤
平移的逆变换
{ x = x 0 − Δ x ( x 0 , y 0 ) 为平移之前的像素坐标 y = y 0 − Δ y ( x , y ) 为 对 应 像 素 平 移 后 的 坐 标 \begin{cases} x=x_0 - \Delta x & \text{$(x_0, y_0)$为平移之前的像素坐标}\\ y=y_0 - \Delta y & \text{$(x, y)为对应像素平移后的坐标$} \end{cases} {x=x0−Δxy=y0−Δy(x0,y0)为平移之前的像素坐标(x,y)为对应像素平移后的坐标
[ x 0 y 0 1 ] = [ x y 1 ] × [ 1 0 0 0 1 0 − Δ x − Δ y 1 ] { \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}\times{ \left[\begin{array}{ccc} 1 & 0 & 0\\ 0 & 1 & 0\\ -\Delta x & -\Delta y & 1 \end{array} \right ]} [x0y01]=[xy1]×⎣⎡10−Δx01−Δy001⎦⎤
前置条件:设图像高度为 H H H,宽度为 W W W,原图中的像素点 ( x 0 , y 0 ) (x_0 , y_0) (x0,y0)经过镜像后的坐标为 ( x , y ) (x , y) (x,y)。
水平镜像:以图像的垂直中轴线为中心交换图像的左右两部分。
{ x = x 0 y = W − y 0 \begin{cases} x=x_0 \\ y=W - y_0 \end{cases} {x=x0y=W−y0
[ x y 1 ] = [ x 0 y 0 1 ] × [ 1 0 0 0 − 1 0 0 W 1 ] { \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}\times{ \left[\begin{array}{ccc} 1 & 0 & 0\\ 0 & -1 & 0\\ 0 & W & 1 \end{array} \right ]} [xy1]=[x0y01]×⎣⎡1000−1W001⎦⎤
垂直镜像:以图像的水平中轴线为中心交换图像的上下两部分
{ x = H − x 0 y = y 0 \begin{cases} x=H - x_0 \\ y=y_0 \end{cases} {x=H−x0y=y0
[ x y 1 ] = [ x 0 y 0 1 ] × [ − 1 0 0 0 1 0 H 0 1 ] { \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}\times{ \left[\begin{array}{ccc} -1 & 0 & 0\\ 0 & 1 & 0\\ H & 0 & 1 \end{array} \right ]} [xy1]=[x0y01]×⎣⎡−10H010001⎦⎤
前置条件:图像中的像素点旋转前的坐标为 ( x 0 , y 0 ) (x_0, y_0) (x0,y0),与y轴的角度为 α \alpha α,旋转 θ \theta θ角度后的坐标为 ( x , y ) (x, y) (x,y),与y轴的角度为 α − θ \alpha - \theta α−θ。
直角坐标公式
齐次坐标公式
[ x y 1 ] = [ x 0 y 0 1 ] × [ c o s θ s i n θ 0 − s i n θ c o s θ 0 0 0 1 ] { \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}\times{ \left[\begin{array}{ccc} cos\theta & sin\theta & 0\\ -sin\theta & cos\theta & 0\\ 0 & 0 & 1 \end{array} \right ]} [xy1]=[x0y01]×⎣⎡cosθ−sinθ0sinθcosθ0001⎦⎤
形状变换类型 | 说明 |
---|---|
偏移变换 | 三维物体投影到平面时所产生的水平方向或者垂直方向的形状变化。 |
平面上比例变换 | 放大、缩小等。 |
直角坐标公式
{ x = x 0 y = S h x 0 + y 0 \begin{cases} x=x_0 \\ y=S_hx_0+y_0 \end{cases} {x=x0y=Shx0+y0
齐次坐标公式
[ x y 1 ] = [ x 0 y 0 1 ] × [ 1 S h 0 0 1 0 0 0 1 ] = [ x 0 S h x 0 + y 0 1 ] { \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}\times{ \left[\begin{array}{ccc} 1 & S_h & 0\\ 0 & 1 & 0\\ 0 & 0 & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & S_hx_0+y_0 & 1 \end{array} \right ]} [xy1]=[x0y01]×⎣⎡100Sh10001⎦⎤=[x0Shx0+y01]
直角坐标公式
{ x = x 0 + S v y 0 y = y 0 \begin{cases} x=x_0 + S_vy_0 \\ y=y_0 \end{cases} {x=x0+Svy0y=y0
齐次坐标公式
[ x y 1 ] = [ x 0 y 0 1 ] × [ 1 0 0 S v 1 0 0 0 1 ] = [ x 0 + S v y 0 y 0 1 ] { \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}\times{ \left[\begin{array}{ccc} 1 & 0 & 0\\ S_v & 1 & 0\\ 0 & 0 & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0+S_vy_0 & y_0 & 1 \end{array} \right ]} [xy1]=[x0y01]×⎣⎡1Sv0010001⎦⎤=[x0+Svy0y01]
直角坐标公式
{ x = c x x 0 比例系数>1:放大 y = c y y 0 比例系数<1:缩小 \begin{cases} x=c_xx_0 & \text{比例系数>1:放大}\\ y=c_yy_0 & \text{比例系数<1:缩小} \end{cases} {x=cxx0y=cyy0比例系数>1:放大比例系数<1:缩小
齐次坐标公式
[ x y 1 ] = [ x 0 y 0 1 ] × [ c x 0 0 0 c y 0 0 0 1 ] = [ c x x 0 c y y 0 1 ] { \left[\begin{array}{ccc} x & y & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} x_0 & y_0 & 1 \end{array} \right ]}\times{ \left[\begin{array}{ccc} c_x & 0 & 0\\ 0 & c_y & 0\\ 0 & 0 & 1 \end{array} \right ]}={ \left[\begin{array}{ccc} c_xx_0 & c_yy_0 & 1 \end{array} \right ]} [xy1]=[x0y01]×⎣⎡cx000cy0001⎦⎤=[cxx0cyy01]
图像的缩小
图像的缩小实际上就是对原有的多个数据进行挑选或者处理,从而获得期望缩小尺寸的数据,并且尽量保持原有的特征不丢失。最简单的方法就是等间隔的选取数据。
图像的放大
图像的放大从字面上看,是图像缩小的逆操作,但是从信息处理的角度来看,则难易程度完全不一样。
图像缩小是从多个信息中选出所需要的信息,而图像放大则是需要对多出的空位填入适当的值,是信息的估计,较图像缩小难度更大。
插值方式 | 效率 | 说明 |
---|---|---|
最近邻插值 | 简单、快速 | 将放大后未知的像素点位置换算到原始图像上,并与原始图像上邻近的4个像素点做比较,最靠近的【如欧式距离等方式计算】邻近点的像素值即为该像素点的像素值。 |
双线性插值 | 较慢 | 将放大后未知的像素点位置换算到原始图像上,并将原始图像上邻近的4个像素点的灰度级别加权求和得到(权值可以采用距离进行度量,距离越近,权值越大)。 |
双三线性插值 |
双向性插值法将放大后未知的像素点位置换算到原始图像上,并将原始图像上邻近的4个像素点的灰度级别加权求和得到。这里的加权采用的是 欧 式 距 离 等 距 离 公 式 / [ W i d t h H e i g h t ] 欧式距离等距离公式/[Width \ Height] 欧式距离等距离公式/[Width Height]。
注意,这里采用的是欧式距离来计算距离,作为权值。
假如存在两个点 A ( x 1 , y 1 ) A(x_1, y_1) A(x1,y1), B ( x 2 , y 2 ) B(x_2, y_2) B(x2,y2),则欧式距离为:
d i s t a n c e = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 distance = \sqrt {(x_1 -x_2)^2+(y_1-y_2)^2} distance=(x1−x2)2+(y1−y2)2
所以权值的计算为: w e i g h t = d i s t a n c e w i d t h ‘ s d i s t a n c e weight = \frac {distance}{width`s \ distance} weight=width‘s distancedistance或者 w e i g h t = d i s t a n c e h e i g h t ‘ s d i s t a n c e weight = \frac {distance}{height`s \ distance} weight=height‘s distancedistance。
双线性插值算法原理分析:
F ( x , y + Δ y ) = ( x − x ) 2 + ( ( y + 1 ) − ( y + Δ y ) ) 2 ( ( x − x ) 2 + ( ( y + 1 ) − y ) 2 F ( x , y ) + ( x − x ) 2 + ( ( y + Δ y ) − y ) 2 ( ( x − x ) 2 + ( ( y + 1 ) − y ) 2 F ( x , y + 1 ) F(x, y+\Delta y)=\frac {\sqrt{(x-x)^2+((y+1)-(y+\Delta y))^2}}{\sqrt{((x-x)^2+((y+1)-y)^2}}F(x, y)\\ +\frac {\sqrt {(x-x)^2+((y+\Delta y)-y)^2}}{\sqrt{((x-x)^2+((y+1)-y)^2}}F(x, y+1) F(x,y+Δy)=((x−x)2+((y+1)−y)2(x−x)2+((y+1)−(y+Δy))2F(x,y)+((x−x)2+((y+1)−y)2(x−x)2+((y+Δy)−y)2F(x,y+1)
F ( x + 1 , y + Δ y ) = ( ( x + 1 ) − ( x + 1 ) ) 2 + ( ( y + 1 ) − ( y + Δ y ) ) 2 ( ( x + 1 ) − ( x + 1 ) ) 2 + ( ( y + 1 ) − y ) 2 F ( x + 1 , y ) + ( ( x + 1 ) − ( x + 1 ) ) 2 + ( ( y + Δ y ) − y ) 2 ( ( x + 1 ) − ( x + 1 ) ) 2 + ( ( y + 1 ) − y ) 2 F ( x + 1 , y + 1 ) F(x+1, y+\Delta y)=\frac {\sqrt{((x+1)-(x+1))^2+((y+1)-(y+\Delta y))^2}}{\sqrt{((x+1)-(x+1))^2+((y+1)-y)^2}}F(x+1, y)\\ +\frac {\sqrt {((x+1)-(x+1))^2+((y+\Delta y)-y)^2}}{\sqrt{((x+1)-(x+1))^2+((y+1)-y)^2}}F(x+1, y+1) F(x+1,y+Δy)=((x+1)−(x+1))2+((y+1)−y)2((x+1)−(x+1))2+((y+1)−(y+Δy))2F(x+1,y)+((x+1)−(x+1))2+((y+1)−y)2((x+1)−(x+1))2+((y+Δy)−y)2F(x+1,y+1)
F ( x + Δ x , y + Δ y ) = ( ( x + 1 ) − ( x + Δ x ) ) 2 + ( ( y + Δ y ) − ( y + Δ y ) ) 2 ( ( x + 1 ) − x ) 2 + ( ( y + Δ y ) − ( y + Δ y ) ) 2 F ( x , y + Δ y ) + ( ( x + Δ x ) − x ) 2 + ( ( y + Δ y ) − ( y + Δ y ) ) 2 ( ( x + 1 ) − x ) 2 + ( ( y + Δ y ) − ( y + Δ y ) ) 2 F ( x + 1 , y + Δ y ) F(x+\Delta x, y+\Delta y)=\frac {\sqrt{((x+1)-(x+\Delta x))^2+((y+\Delta y)-(y+\Delta y))^2}}{\sqrt{((x+1)-x)^2+((y+\Delta y)-(y+\Delta y))^2}}F(x, y+\Delta y)\\ +\frac {\sqrt {((x+\Delta x)-x)^2+((y+\Delta y)-(y+\Delta y))^2}}{\sqrt{((x+1)-x)^2+((y+\Delta y)-(y+\Delta y))^2}}F(x+1, y+\Delta y) F(x+Δx,y+Δy)=((x+1)−x)2+((y+Δy)−(y+Δy))2((x+1)−(x+Δx))2+((y+Δy)−(y+Δy))2F(x,y+Δy)+((x+1)−x)2+((y+Δy)−(y+Δy))2((x+Δx)−x)2+((y+Δy)−(y+Δy))2F(x+1,y+Δy)