MATLAB:图像旋转与插值并比较前后MSE
为什么图像旋转需要插值?
图像旋转或者放大后,原本大小将发生改变,需要对一些新的像素点进行计算。MATLAB自带函数imrotate()
可以实现图像旋转(MATLAB使用双三次插值)。感兴趣还可以了解flipdim、mirror、transp等函数。
常用的插值方法
最近邻插值
在一维空间中,最近邻插值就相当于四舍五入取整。在二维图像中,像素点的坐标都是整数,该方法就是选取离目标点最近的点。
最近相邻插值算法的优点是计算量很小,算法也简单,因此运算速度较快。但它仅使用离待测采样点最近的像素的灰度值作为该采样点的灰度值,而没考虑其他相邻像素点的影响,因而重新采样后灰度值有明显的不连续性,图像质量损失较大,会产生明显的马赛克和锯齿现象。
例如:我们约定,使用左/上原有像素点对放大的图像插值,将得到类似的结果。
双线性插值
两次线性插值算法(Bilinear Interpolation)是一种通过平均周围像素颜色值来添加像素的方法。该方法可生成中等品质的图像。
两次线性插值算法输出的图像的每个像素都是原图中四个像素(2×2)运算的结果,由于它是从原图四个像素中运算的,因此这种算法很大程度上消除了锯齿现象,而且效果也比较好。只是计算量稍大一些,但缩放后图像质量高,基本克服了最近邻插值法灰度值不连续的特点,因为它考虑了待测采样点周围四个直接邻点对该采样点的相关性影响。
但是,此方法仅考虑待测样点周围四个直接邻点灰度值的影响,而未考虑到各邻点间灰度值变化率的影响,因此具有低通滤波器的性质,从而导致缩放后图像的高频分量受到损失,图像边缘在一定程度上变得较为模糊。
可以直观地像上图那样理解双线性插值。
严谨的计算公式:
f ( i + u , j + v ) = ( 1 − u ) ( 1 − v ) f ( i , j ) + ( 1 − u ) v f ( i , j + 1 ) + u ( 1 − v ) f ( i + 1 , j ) + u v f ( i + 1 , j + 1 ) f( i+u, j+v)=(1-u)(1-v) f(i,j) + (1-u) v f(i,j+1) + u (1-v) f( i+1,j ) + u v f( i+1, j+1) f(i+u,j+v)=(1−u)(1−v)f(i,j)+(1−u)vf(i,j+1)+u(1−v)f(i+1