# 环境
- Python:3.6.5 OpenCV 4.1.2
- C++:OpenCV 4.1.2
- JS:OpenCV 4.5.0
环境搭建可参考:B 站视频
# 知识点
四种最常见的图像插值算法
- INTER_NEAREST = 0
- INTER_LINEAR = 1
- INTER_CUBIC = 2
- INTER_LANCZOS4 = 4
相关 API
void resize(InputArray src, OutputArray dst, Size dsize, double fx = 0, double fy = 0, int interpolation = INTER_LINEAR);
如果 Size
被设置的话,则根据 Size
做缩放插值;否则根据 fx
和 fy
做缩放插值。
应用场景
常被用于图像的几何变换、透视变换及插值计算新像素等。在计算量方面,临近点插值计算量最小,双立方插值计算量最大;在精度方面,临近点插值精度最低,具有明显的齿距效果,双立方插值的精度最高;
关于这四种插值算法的详细代码及理论解释可参考以下博客
- 图像放缩之临近点插值
- 图像放缩之双线性内插值
- 图像放缩之双立方插值
- 图像处理之三种常见双立方插值算法
- 图像处理之 Lanczos 采样放缩算法
# C++ 代码
#ifndef DAY14
#define DAY14
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
void day14() {
Mat src = imread("E:\\_Image\\OpenCVTest\\small.png");
if (src.empty()) {
cout << "could not load image.." << endl;
return;
}
imshow("src", src);
int h = src.rows;
int w = src.cols;
float fx = 0.0, fy = 0.0;
Mat dst = Mat::zeros(src.size(), src.type());
resize(src, dst, Size(w * 2, h * 2), fx = 0, fy = 0, INTER_NEAREST);
imshow("INTER_NEAREST", dst);
resize(src, dst, Size(w * 2, h * 2), fx = 0, fy = 0, INTER_LINEAR);
imshow("INTER_LINEAR", dst);
resize(src, dst, Size(w * 2, h * 2), fx = 0, fy = 0, INTER_CUBIC);
imshow("INTER_CUBIC", dst);
resize(src, dst, Size(w * 2, h * 2), fx = 0, fy = 0, INTER_LANCZOS4);
imshow("INTER_LANCZOS4", dst);
waitKey();
}
#endif // !DAY14
# 结果展示
可以看出,临近点插值的锯齿效果还是挺明显的~