如何详细解析OpenCV中cv.resize()图像缩放函数?

2026-04-30 15:072阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1893个文字,预计阅读时间需要8分钟。

如何详细解析OpenCV中cv.resize()图像缩放函数?

目录+系列前言+API+函数详解+参数列表+缩放方式其一+缩放方式其二+两种缩放方式的优先级+关于插值方式+扩展+相关函数+总结+系列前言+本系列是我第一次想要深入探索的系列。每篇文章将全面介绍。

目录
  • 系列前言
  • API
  • 函数详解
    • 参数列表
    • 缩放方式其一
    • 缩放方式其二
    • 两种方式的优先级
    • 关于插值方式
  • 扩展 —— 相关函数
    • 总结

      系列前言

      这个系列是我第一个想要更下去的系列。每篇会全面介绍一个 OpenCV 函数,会给出 API 和示例。示例主要是用 Python 去写,但是 OpenCV 的原生语言是 C++,所以想翻译过去其实很简单。介绍过程中如果有相关的 CV 知识也会一并写入,还是那句话,争取做到说人话,让小白也能看得懂。

      API

      API 来自 OpenCV官方文档

      C++

      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]]]])

      函数详解

      顾名思义,这个函数可以把图片缩放到你想要的大小。

      参数列表

      在这里我们主要说 Python 的参数。把各个参数的含义和相关信息打一张表:

      参数类型是否必须指定具体含义srcnumpy.ndarray是原图像dsizetuple<int>是缩放后的图像大小dst无所谓否目标图像,但是在 Python 里面没有任何意义。一般不传参或者设成 Nonefx, fy数值类型否x 和 y 方向上的缩放比例interpolationint否插值方式表示代码,本质是一个 int 数值,一般用 OpenCV 内置的参数代号以提高可读性。

      看这张表想必大家就很清楚了。

      缩放方式其一

      那么,想要实现缩放图像,有两种方法。第一种方法是指定缩放后的图像大小。下面是实现这个功能的一个简单的程序。后面的给出的其他程序都是对 resize 所在行进行的改动。

      import numpy as np import cv2 as cv img = cv.imread("你希望缩放的图片") # 缩放图像,后面的其他程序都是在这一行上改动 dst = cv.resize(img, (400, 300)) # 显示图像 cv.imshow("dst: %d x %d" % (dst.shape[0], dst.shape[1]), dst) cv.waitKey(0) cv.destroyAllWindows()

      在这个例子中,我们指定了缩放后图像的大小为 400 x 300resize 函数就会将图像拉伸到这个大小,拉伸后的图像相比于原图不会有任何的裁剪。

      缩放方式其二

      另一种方法,就是利用后面的 fxfy,指定缩放后图像长宽相对于原图的比例。如果利用这两个参数,前面的 dsize 要写成一个不合法的形式(比如:(0, 0))。具体原因后面会解释。

      注意,在 dsizefx 中间其实隔了一个无用的 dst,虽然没有实际作用,但是这个参数确实存在,按照 Python 的函数传参规则,要么指明实参传递给哪个形参,要么按顺序传参不能遗漏。具体看下面的例子,两行的效果一致,都是将图像横向缩放为原来的 0.5 倍,纵向缩放为原来的 0.3 倍。

      # 形参缺省 dst = cv.resize(img, (0, 0), None, 0.5, 0.3) # 指明形参 dst = cv.resize(img, (0, 0), fx=0.5, fy=0.3)

      值得注意的是,缩放后的图像宽高是根据 round(img.shape[0] * fx)round(img.shape[1] * fy) 来计算的,所以即使 fxfy 并不是0,只要这两个计算结果中有一个是 0,也会报错。

      两种方式的优先级

      OpenCV 会先检查 dsize 是否合法,即图像的宽和高是否都是非 0 的。如果是,就按照这个缩放,忽略后面的 fxfy;如果不是,就按照 fxfy 来计算。即优先级: dsize > fx fy.

      另外,两种方式是独立定义的,也就是不能混着,用数值指定长却用比率指定宽。不存在 cv.resize(img, (0, 400), fx=0.42) 这种用法!

      如何详细解析OpenCV中cv.resize()图像缩放函数?

      关于插值方式

      最后一个参数,在 resize 函数里有 7 种可能取值,参考OpenCV文档相关页。但是我这里第 7 个参数是不存在的,或许是版本问题?最后两个参数我试过,会报错,不行。

      虽然这些参数非常庞杂,但他们的插值效果却差不多,一般情况下,默认的线性插值就够用。如果非要给点建议的话,我翻译一下官网方文档的原话:

      要缩小图片,一般来说最好的插值方法是 cv.INTER_AREA,而要放大一张图片的话,一般来说效果最好的是 cv.INTER_CUBIC (速度慢)或者 cv.INTER_LINEAR (速度快一些但结果仍然不错)

      扩展 —— 相关函数

      OpenCV 为缩放图像的大小提供了其他的选择,这里说两个函数:cv.pyrUpcv.pyrDown

      这两个函数可以用于构建图像金字塔,pyrUp 可以将图像长宽均放大为原来的 2 倍,而 pyrDown 则可以将图像长宽缩小为原来的 1/2. 与 resize 不同的是,这两个函数和高斯卷积核紧密相关。pyrUp 是对图像升采样,隔行隔列插入零向量之后用高斯核卷积,而 pyrDown 则是对图像高斯卷积后隔行隔列采样。两个的卷积核成倍数关系,前者是后者的4倍。

      总结

      到此这篇关于OpenCV图像缩放之cv.resize()函数详解的文章就介绍到这了,更多相关OpenCV图像缩放cv.resize()函数内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

      本文共计1893个文字,预计阅读时间需要8分钟。

      如何详细解析OpenCV中cv.resize()图像缩放函数?

      目录+系列前言+API+函数详解+参数列表+缩放方式其一+缩放方式其二+两种缩放方式的优先级+关于插值方式+扩展+相关函数+总结+系列前言+本系列是我第一次想要深入探索的系列。每篇文章将全面介绍。

      目录
      • 系列前言
      • API
      • 函数详解
        • 参数列表
        • 缩放方式其一
        • 缩放方式其二
        • 两种方式的优先级
        • 关于插值方式
      • 扩展 —— 相关函数
        • 总结

          系列前言

          这个系列是我第一个想要更下去的系列。每篇会全面介绍一个 OpenCV 函数,会给出 API 和示例。示例主要是用 Python 去写,但是 OpenCV 的原生语言是 C++,所以想翻译过去其实很简单。介绍过程中如果有相关的 CV 知识也会一并写入,还是那句话,争取做到说人话,让小白也能看得懂。

          API

          API 来自 OpenCV官方文档

          C++

          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]]]])

          函数详解

          顾名思义,这个函数可以把图片缩放到你想要的大小。

          参数列表

          在这里我们主要说 Python 的参数。把各个参数的含义和相关信息打一张表:

          参数类型是否必须指定具体含义srcnumpy.ndarray是原图像dsizetuple<int>是缩放后的图像大小dst无所谓否目标图像,但是在 Python 里面没有任何意义。一般不传参或者设成 Nonefx, fy数值类型否x 和 y 方向上的缩放比例interpolationint否插值方式表示代码,本质是一个 int 数值,一般用 OpenCV 内置的参数代号以提高可读性。

          看这张表想必大家就很清楚了。

          缩放方式其一

          那么,想要实现缩放图像,有两种方法。第一种方法是指定缩放后的图像大小。下面是实现这个功能的一个简单的程序。后面的给出的其他程序都是对 resize 所在行进行的改动。

          import numpy as np import cv2 as cv img = cv.imread("你希望缩放的图片") # 缩放图像,后面的其他程序都是在这一行上改动 dst = cv.resize(img, (400, 300)) # 显示图像 cv.imshow("dst: %d x %d" % (dst.shape[0], dst.shape[1]), dst) cv.waitKey(0) cv.destroyAllWindows()

          在这个例子中,我们指定了缩放后图像的大小为 400 x 300resize 函数就会将图像拉伸到这个大小,拉伸后的图像相比于原图不会有任何的裁剪。

          缩放方式其二

          另一种方法,就是利用后面的 fxfy,指定缩放后图像长宽相对于原图的比例。如果利用这两个参数,前面的 dsize 要写成一个不合法的形式(比如:(0, 0))。具体原因后面会解释。

          注意,在 dsizefx 中间其实隔了一个无用的 dst,虽然没有实际作用,但是这个参数确实存在,按照 Python 的函数传参规则,要么指明实参传递给哪个形参,要么按顺序传参不能遗漏。具体看下面的例子,两行的效果一致,都是将图像横向缩放为原来的 0.5 倍,纵向缩放为原来的 0.3 倍。

          # 形参缺省 dst = cv.resize(img, (0, 0), None, 0.5, 0.3) # 指明形参 dst = cv.resize(img, (0, 0), fx=0.5, fy=0.3)

          值得注意的是,缩放后的图像宽高是根据 round(img.shape[0] * fx)round(img.shape[1] * fy) 来计算的,所以即使 fxfy 并不是0,只要这两个计算结果中有一个是 0,也会报错。

          两种方式的优先级

          OpenCV 会先检查 dsize 是否合法,即图像的宽和高是否都是非 0 的。如果是,就按照这个缩放,忽略后面的 fxfy;如果不是,就按照 fxfy 来计算。即优先级: dsize > fx fy.

          另外,两种方式是独立定义的,也就是不能混着,用数值指定长却用比率指定宽。不存在 cv.resize(img, (0, 400), fx=0.42) 这种用法!

          如何详细解析OpenCV中cv.resize()图像缩放函数?

          关于插值方式

          最后一个参数,在 resize 函数里有 7 种可能取值,参考OpenCV文档相关页。但是我这里第 7 个参数是不存在的,或许是版本问题?最后两个参数我试过,会报错,不行。

          虽然这些参数非常庞杂,但他们的插值效果却差不多,一般情况下,默认的线性插值就够用。如果非要给点建议的话,我翻译一下官网方文档的原话:

          要缩小图片,一般来说最好的插值方法是 cv.INTER_AREA,而要放大一张图片的话,一般来说效果最好的是 cv.INTER_CUBIC (速度慢)或者 cv.INTER_LINEAR (速度快一些但结果仍然不错)

          扩展 —— 相关函数

          OpenCV 为缩放图像的大小提供了其他的选择,这里说两个函数:cv.pyrUpcv.pyrDown

          这两个函数可以用于构建图像金字塔,pyrUp 可以将图像长宽均放大为原来的 2 倍,而 pyrDown 则可以将图像长宽缩小为原来的 1/2. 与 resize 不同的是,这两个函数和高斯卷积核紧密相关。pyrUp 是对图像升采样,隔行隔列插入零向量之后用高斯核卷积,而 pyrDown 则是对图像高斯卷积后隔行隔列采样。两个的卷积核成倍数关系,前者是后者的4倍。

          总结

          到此这篇关于OpenCV图像缩放之cv.resize()函数详解的文章就介绍到这了,更多相关OpenCV图像缩放cv.resize()函数内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!