• opencv resize


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    # -*- coding: utf-8 -*-
    '''
    今天来看看opencv中的resize方法。
    就打个tag: opencv resize
    先看看官方定义
    void cv::resize (   InputArray  src,
    OutputArray     dst,
    Size    dsize,
    double  fx = 0,
    double  fy = 0,
    int     interpolation = INTER_LINEAR
    )      
     
    Python:
    dst =   cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]    )
    各个参数可以参考c++版本的数据类型,注意c++和python两者参数顺序有不同。简单解释如下:
    参数  类型  是否必须指定  具体含义
    src numpy.ndarray   是        原图像
    dsize   tuple    是        缩放后的图像大小
    dst     无所谓  否            目标图像,但是在 Python 里面没有任何意义。一般不传参或者设成 None
    fx, fy  数值类型    否       x 和 y 方向上的缩放比例
    interpolation   int 否   插值方式表示代码,本质是一个 int 数值,一般用 OpenCV 内置的参数代号以提高可读性。
    具体可以参考官方的这个解释:
    enum    cv::InterpolationFlags {
      cv::INTER_NEAREST = 0,
      cv::INTER_LINEAR = 1,
      cv::INTER_CUBIC = 2,
      cv::INTER_AREA = 3,
      cv::INTER_LANCZOS4 = 4,
      cv::INTER_LINEAR_EXACT = 5,
      cv::INTER_NEAREST_EXACT = 6,
      cv::INTER_MAX = 7,
      cv::WARP_FILL_OUTLIERS = 8,
      cv::WARP_INVERSE_MAP = 16
    }
     
    因此在使用时,可以写代号也可以写出来方法名字。
    使用方法从参数来看,可以设置resize后图像的大小,也可以通过设置方法比例进行resize。
    从参数列别可以看到,参数src, dsize是必须有的参数,后面的参数都是可选,或者是有默认值的参数。因此,就是你指定了fx,fy,也必须
    同时给dsize赋值(可以为None),否则会报错。但是当你指定dsize的大小了,可以不用管fx,fy.
    此处要特别注意,从参数顺序就能看到,此处显示x方向再是y方向的,也就是说先是宽度,再是高度。
    此处主要还是要看官方的一个地方是参数的设置,
    To shrink an image, it will generally look best with INTER_AREA interpolation, whereas to enlarge an image,
    it will generally look best with c::INTER_CUBIC (slow) or INTER_LINEAR (faster but still looks OK).
    这里的意思是,如果resize后,图像变小了,推荐插值算法用INTER_AREA,而如果resize后,图像大小变大了,推荐用INTER_LINEAR或者慢点
    但是效果更好的方式INTER_CUBIC (slow)。因此,如果你确定大多数图像resize前后都是增大还是减小,那就可以相应选择对应的插值方法。
    '''
     
     
    '''
    first, let me see the img shape. When you using img.shape, it is height, width, channel. Remember this.
    '''
    import numpy as np
    import cv2
    img = cv2.imread(r"messi.jpg")
    print('origin image',img.shape) # (296, 474, 3)  in height, width, channel
    cv2.imshow("messi", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
    rimg = cv2.resize(img,dsize=None,fx=2,fy=2,interpolation=cv2.INTER_LINEAR)# 放大了两倍,此处dsize不可以省略,必须指定的参数
    cv2.imshow("resize messi", rimg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
    rwidth = img.shape[1]*2
    rheight = img.shape[0]*2
    # 放大了两倍,此处dsize必须是先width再height.
    rimg2 = cv2.resize(img,dsize=(rwidth, rheight),interpolation=cv2.INTER_LINEAR)
    cv2.imshow("resize messi2", rimg2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
     
    # 当dsize和fx,fy不一致,而且两者又都是有效的,优先选择dsize作为参数,而忽略fx,fy。
    rwidth = img.shape[1]*3
    rheight = img.shape[0]*3
    rimg3 = cv2.resize(img,dsize=(rwidth, rheight),fx=1,fy=1,interpolation=cv2.INTER_LINEAR)
    cv2.imshow("resize messi3", rimg3)
    print ('resize image3: ',rimg3.shape) # (888, 1422, 3)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
     
     
    # 当resize后,图像变小了,那么插入方式建议INTER_AREA。
    rwidth = int(img.shape[1]*0.5)
    rheight = int(img.shape[0]*0.5)
    rimg4 = cv2.resize(img,dsize=(rwidth, rheight),fx=1,fy=1,interpolation=cv2.INTER_AREA)
    cv2.imshow("resize messi4", rimg4)
    print ('resize image4: ',rimg4.shape) # (148, 237, 3)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

      

  • 相关阅读:
    Python多进程(process)(三)子进程与并行
    【Facade模式】C++设计模式——外观模式(门面模式)
    电子学会青少年软件编程 Python编程等级考试三级真题解析(选择题)2020年12月
    OOD : A Self-supervised Framework for Unsupervised Deep Outlier Detection e3笔记
    Nacos、ZooKeeper和Dubbo的区别
    C语言练习百题之#include应用
    微信万能表单系统源码+在线报名+加盟 带前后端完整的搭建教程
    Cocos Creator TypeScript 套牛游戏
    TMGM外汇平台官网最全测评(2022年版)
    功率放大器模块工作原理介绍
  • 原文地址:https://www.cnblogs.com/jianyingzhou/p/16708920.html