简述图像几何变换的类型和方法
数字图像处理,就是利用数字计算机或则其他数字硬件,对从图像信息转换而得到的电信号进行某些数算,以提高图像的实用性。例如从卫星图片中提取目标物的特征参数, 三维立体断层图像的重建等。总的来说,数字图像处理包括点运算、几何处理、图像增强、图像复原、图像形态学处理、图像编码、图像重建、模式识别等。目前数字图像处理的应用越来越广泛,已经渗透到工业、医疗保健、航空航天、军事等各个领域,在国民经济中发挥越来越大的作用。
图像的几何变换,通常包括图像的平移、图像的镜像变换、图像的转置、图像的缩放和图像的旋转等。
程序基本框架如下:
程序开始
读写 BMP 图像
程序结束
图 像 的 平 移
图 像 的 镜 像 图 像 的 转 置 图 像 的 缩 放 图 像 的 旋 转 1 图像的平移
图像的平移是几何变换中最简单的变换之一。
1.1 理论基础
图像平移就是将图像中所有的点都按照指定的平移量水平、垂直移动。设(x0,y0)为原图像上的一点,图像水平平移量为 tx,垂直平移量为 ty, 则平移后点(x0,y0)坐标将变为(x1,y1)。
显然(x0,y0)和(x1,y1)的关系如下:
x1 x0 tx
y1 y0 ty
1
用矩阵表示如下:
x1 1 0 tx x0 y1 0 1 ty y0 1 0 0 1 1
对该矩阵求逆,可以得到逆变换:
x0 1 0 tx x1 y0 0 1 ty x0 x1 tx y1 即 y0 y1 ty
1 0 0 1 1
这样,平移后的图像上的每一点都可以在原图像中找到对应的点。例如,
对于新图中的(0,0)像素,代入上面的方程组,可以求出对应原图中的像素(-tx,-ty)。如果 tx 或 ty 大于 0,则(- tx,- ty)不在原图中。对于不在原图中的点,可以直接将它的像素值统一设置为 0 或则 255(对于灰度图就是黑色或白色)。同样,若有点不在原图中,也就说明原图中有点被移出显示区域。如果不想丢失被移出的部分图像,可以将新生成的图像宽度扩大|tx |,高度扩大| ty |。
2. 图像的镜像变换
图像的镜像变换分为两种:一种是水平镜像,另外一种是垂直镜像。图像的水平镜像操作是将图像的左半部分和右半部分以图像垂直中轴线为中心镜像进行对换;图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线为中心镜像进行对换。
2.1 理论基础
设图像高度为 lHeight,宽度为 lWidth,原图中(x0,y0)经过水平镜像后坐标将变为(lWidth-x0,y0),其矩阵表达式为:
x1 1 0 lWidth y0
y1 0 1
0 x0
1 1 0 0 1
逆运算矩阵表达式为:
x0 1 0 lWidth x1 y0 0 1 y1 x0 lWidth x1 0 即y0 y1
1 0 0 1 1
同样,(x0,y0)经过垂直镜像后坐标将变为(x0,lHeight-y0),其矩
阵表达式为:
2
0 x0 x1 1 0
y1 0 1 lHeight y0 1 1 0 0 1
逆运算矩阵表达式为:
0 x1 x0 1 0 x1 y0 0 1 lHeight y1 即 x0
y0 lHeight y1 1 0 0 1 1
3 图像的转置
图像的转置操作是将图像像素的 x 坐标和 y 坐标互换。该操作将改变图像的大小,图像的高度和宽度将互换。
3.1 理论基础
转置的变换矩阵表达式很简单:
x1 0 1 0 x0 y1 1 0 0 y0 1 0 0 1 1
它的逆矩阵表达式是:
x00 1 0 x1
y0 1 0 0 y1 即 x0 y1
y0 x1 1 0 0 1 1
4 图像的缩放
上面的几种图像几何变换中都是 1:1 的变换,而图像的缩放操作将会改变图像的大小,产生的图像中的像素可能在原图中找不到相应的像素点,这样就必须进行近似处理。一般的方法是直接赋值为和它最相近的像素值,也可以通过一些插值算法来计算。下面的代码直接采用了前一种做法。
4.1 理论基础
假设图像 x 轴方向缩放比率为 fx,y 轴方向缩放比率为 fy,那么原图中点(x0,y0)对应与新图中的点(x1,y1)的转换矩阵为:
3
x1 fx y1 0 1 0
0 0 x0
fy 0 y0
0 1 1
其逆运算如下:
0 x01/ fx
y0 0
1/ fy
1 0 0
0 x1 x0 x1/ fx 0y1即
y0 y1/ fy 1 1
5 图像的旋转
一般图像的旋转是以图像的中心为原点,旋转一定的角度。旋转后,图
像的大小一般会改变。和图像平移一样,既可以把转出显示区域的图像截去, 也可以扩大图像范围以显示所有的图像。
5.1 理论基础
可以推导一下旋转运算的变换公式。如下图所示,点(x0,y0)经过旋转θ度后坐标变成(x1,y1)。
在旋转前:
x0 r cos()
y0 r sin()
旋转后:
x1 r cos() r cos()cos( )
r sin()cos( ) y1 r sin()
r sin()sin() r cos()sin()
x0cos( )
y0sin() y0cos( )
x0sin()
写成矩阵表达式为:
x1 cos() sin() 0 x0
y1 sin()
cos() 0 y0
0 1 1 0 1
其逆运算如下:
x0 cos() y0 sin() 1 0
sin() cos() 0
0 x10 y1 1 1
4
总述:
1. 图像的平移。经典的图像平移有两种算法,一种不会改变图像大小,另一种可以相应扩大图像。本程序采用了第一种算法。为了使图像能按照用户指定的水平平移量和垂直平移量移动,作者首先定义了一个参数设定窗,并在图像平移菜单的事件处理函数中对此对话框进行定义,获取平移量。然后调用图像平移函数,从而实现将图像中所有的点(像素)都按照指定的平移量水平、垂直移动, 平移后的图像上的每一点都可以在原图像中找到对应的点。
2.图像的镜像。图像的水平镜像操作是将图像的左半部分和右半部分以图像垂直中轴线为中心镜像进行对换;图像的垂直镜像操作是将图像上半部分和下半部分以图像水平中轴线镜像进行对换。可以一个个像素进行镜像,也可以利用位图存储的连续性进行整行复制。对于水平镜像作者采用前者,而垂直镜像采用后者,对两种方法都进行了尝试。
3. 图像的转置。即将图像像素的 x 坐标和 y 坐标互换。它和图像的镜像变换类似,不同之处在于图像转置后 DIB 的头文件也要进行相应的改变,即更新宽度和高度信息。因此传递给图像转置函数的参数是直接指向 DIB 的指针,而不是直接指向 DIB 像素的指针。程序首先一个个像素进行转置复制,然后互换 DIB 中图像的高宽,实现图像转置的功能。
4. 图像的缩放。程序将图像按用户设定的 X 轴方向的缩放比率和 Y 轴方向的缩放比率进行缩放。此操作产生的图像中的像素可能在原图中找不到相应的像素点,因此必须进行近似处理。此处理有多种方法,可以采用最邻近插值算法, 也可以采用别的插值算法。后者处理效果要好一些,但是运算量也相应增加很多, 因此本程序采用前者,即最邻近插值算法。最后,由于缩放改变了图像的高度和宽度,因此还需要对 DIB 头文件的高度和宽度信息进行更新。
5. 图像的旋转。程序将图像以图像中心为原点,按照用户设定的旋转角度进行旋转。和图像的平移一样,可以采用不同的算法,既可以把转出显示区域的部分图像截去,也可以扩大图像范围以显示所有图像,在本程序中采用后者。同时为了减小运算量,将图像以图像中心为坐标系原点进行旋转,而不是用户指定的任意一点。
5