Opencv(C++)笔记--图像的resize方法

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;
}

结果:

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值