设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 安全感不是来源于爱,而是偏爱。人只有确定自己是那个例外,才能安心。晚安,好梦。

安全感不是来源于爱,而是偏爱。人只有确定自己是那个例外,才能安心。晚安,好梦。

查看: 371|回复: 0

OpenCV图像缩放之cv.resize()函数详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:231
  • 打卡月天数:0
  • 打卡总奖励:3277
  • 最近打卡:2025-04-05 14:46:39
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
393
主题
371
精华
0
金钱
4472
积分
833
注册时间
2023-1-6
最后登录
2025-5-31

发表于 2023-2-10 22:41:05 | 显示全部楼层 |阅读模式
系列前言

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

API

API 来自 OpenCV官方文档
C++
  1. void cv::resize(InputArray    src,
  2.                 OutputArray   dst,
  3.                 Size          dsize,
  4.                 double        fx = 0,
  5.                 double        fy = 0,
  6.                 int           interpolation = INTER_LINEAR
  7.                )               
复制代码
Python
  1. dst = cv.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
复制代码
函数详解

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

参数列表

在这里我们主要说 Python 的参数。把各个参数的含义和相关信息打一张表:
参数类型是否必须指定具体含义
  1. src
复制代码
  1. numpy.ndarray
复制代码
是原图像
  1. dsize
复制代码
  1. tuple<int>
复制代码
是缩放后的图像大小
  1. dst
复制代码
无所谓否目标图像,但是在 Python 里面没有任何意义。一般不传参或者设成
  1. None
复制代码
  1. fx
复制代码
,
  1. fy
复制代码
数值类型否x 和 y 方向上的缩放比例
  1. interpolation
复制代码
  1. int
复制代码
否插值方式表示代码,本质是一个
  1. int
复制代码
数值,一般用 OpenCV 内置的参数代号以提高可读性。看这张表想必大家就很清楚了。

缩放方式其一

那么,想要实现缩放图像,有两种方法。第一种方法是指定缩放后的图像大小。下面是实现这个功能的一个简单的程序。后面的给出的其他程序都是对
  1. resize
复制代码
所在行进行的改动。
  1. import numpy as np
  2. import cv2 as cv

  3. img = cv.imread("你希望缩放的图片")

  4. # 缩放图像,后面的其他程序都是在这一行上改动
  5. dst = cv.resize(img, (400, 300))

  6. # 显示图像
  7. cv.imshow("dst: %d x %d" % (dst.shape[0], dst.shape[1]), dst)
  8. cv.waitKey(0)
  9. cv.destroyAllWindows()
复制代码
在这个例子中,我们指定了缩放后图像的大小为
  1. 400 x 300
复制代码
  1. resize
复制代码
函数就会将图像拉伸到这个大小,拉伸后的图像相比于原图不会有任何的裁剪。
234211cqsh17hlpnrt3hql.jpeg


缩放方式其二

另一种方法,就是利用后面的
  1. fx
复制代码
  1. fy
复制代码
,指定缩放后图像长宽相对于原图的比例。如果利用这两个参数,前面的
  1. dsize
复制代码
要写成一个不合法的形式(比如:
  1. (0, 0)
复制代码
)。具体原因后面会解释。
注意,在
  1. dsize
复制代码
  1. fx
复制代码
中间其实隔了一个无用的
  1. dst
复制代码
,虽然没有实际作用,但是这个参数确实存在,按照 Python 的函数传参规则,要么指明实参传递给哪个形参,要么按顺序传参不能遗漏。具体看下面的例子,两行的效果一致,都是将图像横向缩放为原来的 0.5 倍,纵向缩放为原来的 0.3 倍。
  1. # 形参缺省
  2. dst = cv.resize(img, (0, 0), None, 0.5, 0.3)

  3. # 指明形参
  4. dst = cv.resize(img, (0, 0), fx=0.5, fy=0.3)
复制代码
值得注意的是,缩放后的图像宽高是根据
  1. round(img.shape[0] * fx)
复制代码
  1. round(img.shape[1] * fy)
复制代码
来计算的,所以即使
  1. fx
复制代码
  1. fy
复制代码
并不是0,只要这两个计算结果中有一个是 0,也会报错。
234211aby9j2ilbyur7ll0.jpeg


两种方式的优先级

OpenCV 会先检查
  1. dsize
复制代码
是否合法,即图像的宽和高是否都是非 0 的。如果是,就按照这个缩放,忽略后面的
  1. fx
复制代码
  1. fy
复制代码
;如果不是,就按照
  1. fx
复制代码
  1. fy
复制代码
来计算。即优先级:
  1. dsize
复制代码
>
  1. fx
复制代码
  1. fy
复制代码
.
另外,两种方式是独立定义的,也就是不能混着,用数值指定长却用比率指定宽。不存在
  1. cv.resize(img, (0, 400), fx=0.42)
复制代码
这种用法!

关于插值方式

最后一个参数,在
  1. resize
复制代码
函数里有 7 种可能取值,参考OpenCV文档相关页。但是我这里第 7 个参数是不存在的,或许是版本问题?最后两个参数我试过,会报错,不行。
虽然这些参数非常庞杂,但他们的插值效果却差不多,一般情况下,默认的线性插值就够用。如果非要给点建议的话,我翻译一下官网方文档的原话:
要缩小图片,一般来说最好的插值方法是
  1. cv.INTER_AREA
复制代码
,而要放大一张图片的话,一般来说效果最好的是
  1. cv.INTER_CUBIC
复制代码
(速度慢)或者
  1. cv.INTER_LINEAR
复制代码
(速度快一些但结果仍然不错)


扩展 —— 相关函数

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

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

总结

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表