插值方式

  • resize 函数的介绍
  • 各种插值方式
  • INTER_NEAREST,最近邻插值法
  • INTER_LINEAR,双线性插值法
  • 总结


resize 函数的介绍

无论是通过C++来编写opencv,还是通过python来写opencv,它们所包有的函数是基本一致的,因此,在这里我通过python来举例子:
cv2.resize(img,(0,0),fx=0.5,fy=0.5,interpolation=cv2.INTER_NEAREST)
在这里,里面有四个属性,第一个属性是输入图像的矩阵,即通过imread()函数将图片读入,得到了数值矩阵并存放到img中;而第二个属性则是(0,0),而这表示并不是直接通过规定缩放或放大后的图像大小;而第三个属性fx和fy则是0.5,表示长宽都缩小一倍;而第四个属性则是插值方法了。

各种插值方式

插值方法则是当图片缩放时,图片的像素点数值的大小的变化,因为图片的大小发生了变化,因此,这时插值方法就显得较为重要,否则,在不同的应用场合会造成不必要的影响。而插值方式分以下几种:

  1. INTER_NEAREST,即最近邻插值法;
  2. INTER_LINEAR,即双线性插值法,这也是默认设置,当我们忽略这一条属性时,计算机就会默认我们选的是这个;
  3. INTER_AREA,即区域插值法,使用像素区域关系进行重采样。 它大概率下是图像抽取的首选方法,因为它会产生无云纹理的结果。 但是当图像缩放时,它类似于INTER_NEAREST方法。
  4. INTER_CUBIC,即三次样条插值
  5. INTER_LANCZOS4,即8x8像素邻域的Lanczos插值

实际上,这些插值方法都是通过比较变化前后图像,从而推出一个映射关系,找到每个对应的像素点,而由于变化前后图像大小的不一样,可能对应的像素是一个虚拟的像素,即为一个浮点数,而并非是一个整数,因此衍生出了如何解决这个虚拟像素取值的问题,从而得到了以上的方法。

INTER_NEAREST,最近邻插值法

最近邻插值法将虚拟像素坐标的浮点数进行了四舍五入,比如坐标为(10,10)的像素点,对应到了虚拟像素点(0.75,0.75),而这四舍五入后,则为(1,1),而这样的插值方法极为不准确,若是放大图像,则会生成马赛克,若是缩小图片,又会发生失真的情况,实际上,如果遇到了这种情况,比较好的做法是将虚拟像素点周围四个点按照公式计算出来,这样效果才是最好的,例如双线性插值法,而之前的做法仅仅会导致大量的信息丢失,而这极其不符合图片压缩的原理(在损失最小的压缩所得到的结果就是最本质的结构),而我们按照了这种方法,则已经将大量的信息丢失,损失已经是相当地大了,但这不可否认是最基本的一种插值方法。

INTER_LINEAR,双线性插值法

正如我们之前所提到的,双线性插值法就是在所得到的虚拟像素点周围四个真实点按照所给定的公式计算得到,而这样做,则是让我们将图片的信息结合到了一起,图片损失较小,当然,像这种插值方法,无论是哪种方法,所生成的图片的质量相比于原有的图片来说,总是有所不如的。

总结

这五种插值方法的具体含义就不一一列举了,但总而言之,这五种方法,一种比一种好,只是需要耗费的时间也越来越多。