文章目录
- 一、插值算法
- 最近邻插值(Nearest Interpolation)
- 线性插值(Linear interpolation)
- 双三次插值(Bicubic interpolation)
- 区域插值(Area interpolation)
- Lanczos插值
- 插值算法耗时比较
- 二、图像缩放
一、插值算法
由于图片存储的时候其实就是一个矩阵,所以在对图像进行缩放操作的时候,也就是在对矩阵进行操作。如果想要将图片放大,这里我们就需要用到过采样算法来扩大矩阵,利用欠采样来缩小图像。
opencv 官网关于插值算法介绍:InterpolationFlags
https://docs.opencv.org/master/d7/da8/tutorial_table_of_content_imgproc.html
最近邻插值(Nearest Interpolation)
黑色的×表示需要插入的值,它会选择距离它最近的 的值来作为它的值。当插入的值距离四个点都相等时,会选择距离最近的左上角的值。
线性插值(Linear interpolation)
这里的线性插值其实是指双线性插值,这种插值算法也是resize函数中默认使用的插值算法。
假设我们已知坐标 与 ,我们想要得到在区间
其实 P 点的值等于周围四个点()与P点所构成的四个对角矩形面积的加权平均。
双三次插值(Bicubic interpolation)
双三次插值是一种更加复杂的插值算法,是二维空间中最常用的插值算法,相对双线性插值的图像边缘更加平滑,函数 在点 的值可以通过矩形网格中最近的十六个采样点的加权平均得到,这里需要使用两个多项式插值三次函数,每个方向使用一个。
双三次插值常用的BiCubic函数如下图
区域插值(Area interpolation)
区域插值算法主要分两种情况,缩小图像和放大图像的工作原理并不相同。
- 缩小图像
如果图像缩小的比例是整数倍,在调用INTER_LINEAR_EXACT插值算法时,
如果图像的宽和高的缩小比例都是2,而且图像的通道数不是2,实际上会调用INTER_AREA。在调用INTER_LINEAR时,如果图像的宽和高的缩小比例都是2,实际上是会调用INTER_AREA。
INTER_AREA实际上是个box filter,类似于均值滤波器。 - 放大图像
如果放大图像的比例是整数倍,与最近邻插值相似。
如果放大的比例不是整数倍,则会采用线性插值。
Lanczos插值
Lanczos插值属于一种模板算法,需要通过计算模板中的权重信息来计算 x对应的值。
对于一维信息,假如我们输入的点集为 X,那么,Lanczos对应有个窗口模板Window,窗口中每个位置的权重计算如下:
插值算法耗时比较
二、图像缩放
头文件 quick_opencv.h
:声明类与公共函数
主函数调用该类的公共成员函数
源文件 quick_demo.cpp
:实现类与公共函数
从左至右:缩小、原图、放大