如果需要处理的原图及代码,请移步小编的GitHub地址
传送门:请点击我
如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice
图像的几何变换是在不改变图像内容的前提下对图像像素进行空间几何变换,主要包括了图像的平移变换,缩放,旋转,翻转,镜像变换等。
1,几何变换的基本概念 1.1 坐标映射关系图像的几何变换改变了像素的空间位置,建立一种原图像像素与变换后图像像素之间的映射关系,通过这种映射关系能够实现下面两种计算:
1,原图像任意像素计算该像素在变换后图像的坐标位置
2,变换后图像的任意像素在原图像的坐标位置
对于第一种计算,只要给出原图像上的任意像素坐标,都能通过对应的映射关系获得到该像素在变换后图像的坐标位置。将这种输入图像坐标映射到输出的过程称为“向前映射”。反过来,知道任意变换后图像上的像素坐标,计算其在原图像的像素坐标,将输出图像映射到输入的过程称为“向后映射”。但是,在使用向前映射处理几何变换时却有一些不足,通常会产生两个问题:映射不完全,映射重叠。
1,映射不完全
输入图像的像素总数小于输出图像,这样输出图像中的一些像素找不到在原图像中的映射。
上图中只有四个坐标点根据映射关系在原图像找到了相对应的像素,其余12个坐标没有有效值。
2,映射重叠
根据映射关系,输入图像的多个像素映射到输出图像的同一个像素上。
上面左上角的四个像素都会映射到输出图像的(0, 0)那么我们输出的(0,0)应该取那个像素值呢?
要解决上述两个问题可以使用“向后映射”,使用输出图像的坐标反过来推算改坐标对应于原图像中的坐标位置。这样,输出图像的每个像素都可以通过映射关系在原图像中找到唯一对应的像素,而不会出现映射不完全和映射重叠。所以,一般使用向后映射来处理图像的几何变换。从上面也可以看出,向前映射之所以会出现问题,主要是由于图像像素的总数发生了变换,也就是图像的大小改变了。在一些图像大小不会发生变化的变换中,向前映射还是很有效的。
1.2 插值算法对于数字图像而言,像素的坐标是离散型非负整数,但是在进行变换的过程中有可能产生浮点坐标值。例如,原图像坐标(9, 9)在缩小一倍时会变成(4.5, 4.5),这显然是一个无效的坐标。插值算法就是用来处理这些浮点坐标的。常见的插值算法有最邻近插值法,双线性插值法,二次立方插值法,三次立方插值法等。这里主要学习最邻近插值和双线性插值。
最邻近插值
最邻近插值法,也成为零阶插值法,最简单插值算法,当然效果也是最差的。它的思想相当简单,就是四舍五入,浮点坐标的像素值等于距离该点最近的输入图像的像素值。
上面的C代码可以求得(x, y)的最邻近插值坐标(u, v)。
最邻近插值几乎没有多余的运算,速度相当快,但是这种邻近取值的方法是很粗糙的,会造成图像的马赛克,锯齿等现象。
双线性插值法
双线性插值法,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。
双线性插值法作为数值分析的一种插值算法,广泛应用在信号处理,数字图像和视频处理等方面。
下面举个简单的例子,假设要求坐标为(2.4, 3)的像素值P,该点在(2, 3)和(3, 3)之间,如下图:
u 和 v 分别是距离浮点坐标最近两个整数坐标像素在浮点坐标像素所占的比例。