1--近邻算法代码
#include <opencv2/opencv.hpp>
#include <cstdio>
// 近邻算法
void xresize(const cv::Mat &src, cv::Mat &des, cv::Size size){
des.create(size, src.type());
// 映射的原图坐标
int sx, sy = 0;
// 比例
float fx = (float)src.cols / des.cols;
float fy = (float)src.rows / des.rows;
for(int x = 0; x < des.cols; x++){
sx = fx * x + 0.5; // x为目标图的坐标
for(int y = 0; y < des.rows; y++){
sy = fy * y + 0.5; // y目标图的坐标
des.at<cv::Vec3b>(y, x) = src.at<cv::Vec3b>(sy, sx);
}
}
}
int main(int argc, char *argv[]){
cv::Mat src = cv::imread("../test1.jpg");
cv::Mat img256;
cv::Mat des256;
// 自定义函数
xresize(src, img256, cv::Size(256, 256));
// OpenCV自定义函数, 后两个0表示fx,fy,当Size为None时使用fx,fx进行resize
cv::resize(src, des256, cv::Size(256, 256), 0, 0, cv::INTER_NEAREST);
cv::imshow("src", src);
cv::imshow("img256", img256);
cv::imshow("des256", des256);
cv::waitKey(0);
return 0;
}
2--近邻算法结果
3--双线性插值算法代码
#include <opencv2/opencv.hpp>
#include <cstdio>
int main(int argc, char *argv[]){
cv::Mat src = cv::imread("../test1.jpg");
cv::Mat img1024;
cv::Mat des1024;
cv::resize(src, img1024, cv::Size(1024, 1024), 0, 0, cv::INTER_NEAREST); // 近邻
cv::resize(src, des1024, cv::Size(1024, 1024), 0, 0, cv::INTER_LINEAR); // 双线性插值
imshow("src", src);
imshow("img1024", img1024);
imshow("des1024", des1024);
cv::waitKey(0);
return 0;
}
4--双线性插值算法结果
原理分析:双线性插值实质上是使用两次单线性插值操作进行数据的处理,原理如下(字丑莫怪)(参考):
结果分析:双线性插值的结果更平滑,分析原理可知利用邻近的四个像素点进行处理,类似一个滤波的操作;
5--图像金字塔
①高斯金字塔:用于向下采样;
②拉普拉斯金字塔:用来从金字塔底层图像重建上层未采样图像;
③原理:参考
代码:
#include <opencv2/opencv.hpp>
#include <cstdio>
int main(int argc, char *argv[]){
cv::Mat src = cv::imread("../test1.jpg");
cv::Mat gsrc;
cv::Mat lsrc;
cv::pyrDown(src, gsrc);
cv::pyrUp(src, lsrc);
cv::imshow("src", src);
cv::imshow("gsrc", gsrc);
cv::imshow("lsrc", lsrc);
cv::waitKey(0);
return 0;
}
结果:
版权归原作者 布吉岛呀~ 所有, 如有侵权,请联系我们删除。