实验目的
学习使用图像灰度插值方法并对效果进行评估。图像灰度插值要解决的是:非整数点的灰度确定问题。主要介绍了三种差值方法:
- 最近邻插值(nearest neighbor interpolation):最简单,误差最大
- 双线性插值(bilinear interpolation):有低通滤波性质
- 三次插值:多项式、B样条等,精度高但计算量大
具体任务描述:读图(Chapter2_1.pgm)、顺时针方向旋转15º(利用上述几种插值方法)、输出图像(测试图像见下图),可用C++、Matlab、OpenCV或Python编程,要评估量化插值效果,并对结果进行讨论。
提示:
1.可正反转回到原点,然后比较未转的图像
2.如何定义评估量、其计算的合理性、原点的精确匹配等都要仔细考虑证实
3.出现了未预料的结果:找出原因,并寻求解决之道
软件平台
Python3.8 + OpenCV + Jupyter Notebook
实验过程
1. 图像处理部分
使用openCV库函数实现图片的2次旋转操作,需注意保证旋转保留图像边缘,使用getRotationMatrix2D函数获得图像绕着中心点的旋转矩阵,此处缩放因子设为1.0。在二维空间中,旋转可以用一个单一的角定义。作为约定,正角表示逆时针旋转。得出的旋转矩阵为:
根据α,β计算第1次旋转后的新高度和新宽度,从而保证图像边缘保存完整。
最后将这些作为参数并指定具体插值方法使用仿射变换函数warpAffine得出旋转过后的图像。仿射变换是指在几何中,对一个向量空间进行一次线性变换并接上一个平移,变换为另一个向量空间。在几何上定义为两个向量空间之间的一个仿射变换由一个非奇异的线性变换接上一个平移变换组成。
代码如下:
def
接下来第2次旋转也就是反旋转之后进行中心点计算得出偏移量,进而进行黑边去除操作,从而保证与原图像大小一致。
2. 评估插值效果
主要使用了PSNR,图像矩阵的均方差以及相关系数,这三种评价标准对3种插值方法进行比较。
- PSNR“Peak Signal to Noise Ratio”,峰值信噪比。用于评价两幅图像相比质量的好坏,即失真情况。这两幅图像分别为原图像和经图像重建或者压缩等图像处理方法后的图像。PSNR越高,图像失真越小。
其中,MAX为最大像素,即255。这个计算公式主要是针对的是灰度图。
实现代码如下:
def
- MSE,图像矩阵的均方差,对于大小为m*n的两幅图像I和K(一幅是原图,一幅一般是图像重建后的图像),其均方差MSE定义为:
实现代码如下:
def
- CORRELATION, 相关系数。最常见的相关系数是皮尔逊相关系数Pearson correlation coefficient,可以看做是两组数据的向量夹角的余弦。对随机变量X和Y,如果Cov(X,Y) 代表X与Y的协方差,Var(X) 和Var(Y) 代表X和Y的方差,求解公式为:
此处使用科学计算库NumPy内置函数corrcoef()计算皮尔逊积矩相关系数。
结果分析
图像插值是图像处理的重要环节,不同的插值算法有不同的精度,插值算法的好坏也直接影响着图像的失真程度。
最近邻插值算法是选择离它所映射到的位置最近的输入像素的灰度值为插值结果。优点是计算量很小,算法也简单,因此运算速度较快。但它仅使用离待测采样点最近的像素的灰度值作为该采样点的灰度值,而没考虑其他相邻像素点的影响,因而重新采样后灰度值有明显的不连续性,图像质量损失较大。
双线性插值算法要经过三次插值才能获得最终结果,是对最近邻插值法的一种改进,先对两水平方向进行一阶线性插值,然后再在垂直方向上进行一阶线性插值。双线性插值法效果要好于最近邻插值,基本克服了最近邻插值灰度值不连续的特点,因为它考虑了待测采样点周围四个直接邻点对该采样点的相关性影响。但是,此方法仅考虑待测样点周围四个直接邻点灰度值的影响, 而未考虑到各邻点间灰度值变化率的影响, 因此具有低通滤波器的性质。
双三次插值是一种更加复杂的插值方式,它能创造出比双线性插值更平滑的图像边缘。在这种方法中,函数f在点 (x,y) 的值可以通过矩形网格中最近的十六个采样点的加权平均得到。从实验结果能够看出,相比前面两个插值方法,双三次插值在图像效果各个评估指标方面都有一定的提升。