前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >OpenCV 图片缩放

OpenCV 图片缩放

作者头像
AI异构
发布2020-07-29 15:15:10
3.3K0
发布2020-07-29 15:15:10
举报
文章被收录于专栏:AI异构AI异构AI异构

OpenCV图片缩放

resize方法

对图像进行缩放的最简单方法就是调用OpenCV中resize函数。resize函数可以将源图像精确地转化为指定尺寸的目标图像。要缩小图像,一般推荐使用CV_INETR_AREA来插值;若要放大图像,推荐使用CV_INTER_LINEAR。

void resize(
    InputArray src,   
    OutputArray dst,  
    Size dsize,
    double fx=0,
    double fy=0,
    int interpolation=INTER_LINEAR
 );
  • src 输入图像.
  • dst 输出图像; 其sizedsize,或由src.size()fxfy计算而得; dst类型与src保持一致.
  • dsize 输出图像的size;
  • fx 水平轴缩放因子;
  • fy 竖直轴缩放因子;
  • interpolation 选项见下表:

interpolation 选项

所用的插值方法

INTER_NEAREST

最近邻插值

INTER_LINEAR

双线性插值(默认设置)

INTER_AREA

区域插值法

INTER_CUBIC

双三次插值法

图像金字塔方法

图像金字塔同样也是进行图像缩放的,我们先来看一下什么是图像金字塔:

其实非常好理解,如上图所示,我们将一层层的图像比喻为金字塔,层级越高,则图像尺寸越小,分辨率越低

两种类型的金字塔:

  • 高斯金字塔:用于下采样,主要的图像金字塔;
  • 拉普拉斯金字塔:用于重建图像,也就是预测残差,对图像进行最大程度的还原。比如一幅小图像重建为一幅大图像。

图像金字塔有两个高频出现的名词:上采样和下采样。现在说说他们俩。

  • 上采样:就是图片放大,使用PryUp函数。将图像在每个方向放大为原来的两倍,新增的行和列用0填充,使用先前同样的内核(乘以4)与放大后的图像卷积,获得新增像素的近似值。
  • 下采样:就是图片缩小,使用PryDown函数。对图像进行高斯内核卷积,然后将所有偶数行和列去除。

上、下采样都存在一个严重的问题,那就是图像变模糊了,因为缩放的过程中发生了信息丢失的问题。要解决这个问题,就得看拉普拉斯金字塔了。

参考代码

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
int main(int argc, char** argv) {
    Mat src;
    src = imread("cat.jpg");
    if (!src.data) {
        printf("could not load image...\n");
        return -1;
    }
    namedWindow("input image", CV_WINDOW_AUTOSIZE);
    imshow("input image", src);

    /* resize 方法 */
    //方式一:转换为任意尺寸
    Mat dst1;
    dst1 = Mat::zeros(512, 512, CV_8UC3); //转化为512*512大小
    resize(src, dst1, dst1.size());
    namedWindow("resize1", CV_WINDOW_AUTOSIZE);
    imshow("resize1", dst1);
    imwrite("resize1.jpg",dst1);

    //方式二:按比例缩放
    Mat dst2;
    resize(src, dst2, Size(),0.5,0.5);//我长宽都变为原来的0.5倍
    namedWindow("resize2", CV_WINDOW_AUTOSIZE);
    imshow("resize2", dst2);
    imwrite("./resize2.jpg",dst2);

    /* 图像金字塔 */
    Mat dst3,dst4;
    pyrUp(src, dst3, Size(src.cols*2, src.rows*2)); //放大一倍
    pyrDown(src, dst4, Size(src.cols*0.5, src.rows*0.5)); //缩小为原来的一半
    namedWindow("resize3", CV_WINDOW_AUTOSIZE);
    namedWindow("resize4", CV_WINDOW_AUTOSIZE);
    imshow("resize3", dst3);
    imshow("resize4", dst4);
    imwrite("./resize3.jpg",dst3);
    imwrite("./resize4.jpg",dst4);

    waitKey(0);
    return 0;
}
结果

注意:通过上图resize2与resize4的结果比较,我们可以看出:采用图像金字塔缩放与图片resize方法的结果不太一致。图像金字塔缩放的结果明显要模糊!

参考

http://www.cnblogs.com/skyfsm/p/6876732.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-05-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 AI异构 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OpenCV图片缩放
    • resize方法
      • 图像金字塔方法
      • 参考代码
        • 结果
        • 参考
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档