灰度值插值是图像变换所必需的方法,因为图像不是连续的函数,而是数字化的,即由与(离散的)灰度值相关联的像素组成。下图中,输出图像的结果像素不再完全对应于输入图像的一个像素。
插值就是解决这种情况,用已知的数据来估计结果像素的灰度值应该为多少,才不会让原始图像和结果图像在灰度值上有太大的差异。
以下介绍几种常用的插值算法:最近邻插值法(nearest_neighbor)、双线性插值法(bilinear)、等权双线性插值法(constant)、高斯加权双线性插值法(weighted)、双三次插值法(bicubic)
方法一:最近邻插值法(最简单, 最快, 效果最差, 因此只用于时间要求严格的应用程序)
原理:将原始图像中中心最接近结果像素中心的灰度值赋给结果像素,如下图:
旋转后的像素,将把红框的那个像素灰度值作为自己的灰度值
方法二:双线性插值法(结果图像的像素灰度值受到原始图像四个相邻像素的影响,所以结果图像会比最近邻插值法更加平滑(可以认为看起来更加自然),同时需要更长的计算时间)
原理:由周围的四个相邻像素确定,如下图:
具体的计算公式如下:
式中,像素中心点之间的距离是归一化的,也就是说,将原始图像的四个像素中心连成的正方形,边长为1。a、b表示距离,图中易知;h表示灰度值。
注意:最近邻插值法和双线性插值只用于旋转和放大,对于缩小的变换,不建议使用,会出现混叠的情况。要解决这一问题,就需要在图像缩放之前进行平滑处理,利于均值或者高斯滤波,而 ‘constant’ 和 ‘weighted’ 就是融入了这两种平滑方式的插值算法。
方法三:等权双线性插值法(对于图像缩小的情况,由于需要进行平滑处理,因此其计算时间比双线性插值算法多;如果是图像放大,则计算时间与双线性插值相同)
原理: 如下图,先将像素进行次采样得到次像素,次像素分别进行双线性插值得到各自的灰度值,最后用所有次像素的灰度值平均值来作为这个像素的灰度值。
方法四:高斯加权双线性插值法(对于图像缩小的情况,由于需要进行平滑处理,且次采样后的次像素比等权双线性插值法多,因此其计算时间比前面两者多;如果是图像放大,则计算时间与双线性插值相同)
原理:与等权双线性插值法类似,但是会被划分成3*3的次像素,且每个次像素在贡献自己的灰度值时,权重不一样,与高斯平滑的掩膜相同。
特点:没有平滑效果,也是只支持旋转和放大,处理效果比最近邻插值法好很多;如果图像只旋转,那么处理效果与双线性插值差不多,如果是旋转+放大,那么处理效果比双线性插值好很多。但是计算时间更长
所以在选用插值算法的时候,要综合考虑图像的变换情况,处理时间,处理质量等诸多方面。