OpenCV 图像缩放:cv.resize() 函数详解
目录
- 系列前言
- API
- 函数详解
- 参数列表
- 缩放方式其一
- 缩放方式其二
- 两种方式的优先级
- 关于插值方式
- 扩展 —— 相关函数
系列前言
这个系列是我第一个想要更下去的系列。每篇会全面介绍一个 OpenCV 函数,会给出 API 和示例。示例主要是用 Python 去写,但是 OpenCV 的原生语言是 C++,所以想翻译过去其实很简单。介绍过程中如果有相关的 CV 知识也会一并写入,还是那句话,争取做到说人话,让小白也能看得懂。
这个系列尽量周更,我先立个 flag ~
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 的参数。把各个参数的含义和相关信息打一张表:
参数 | 类型 | 是否必须指定 | 具体含义 |
---|---|---|---|
src
|
numpy.ndarray
|
是 | 原图像 |
dsize
|
tuple<int>
|
是 | 缩放后的图像大小 |
dst
|
无所谓 | 否 |
目标图像,但是在 Python 里面没有任何意义。一般不传参或者设成 None
|
fx , fy
|
数值类型 | 否 | x 和 y 方向上的缩放比例 |
interpolation
|
int
|
否 |
插值方式表示代码,本质是一个 int 数值,一般用 OpenCV 内置的参数代号以提高可读性。
|
看这张表想必大家就很清楚了。
缩放方式其一
那么,想要实现缩放图像,有两种方法。第一种方法是指定缩放后的图像大小。下面是实现这个功能的一个简单的程序。后面的给出的其他程序都是对 resize
所在行进行的改动。
import numpy as np
import cv2 as cvimg = 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 300
,resize
函数就会将图像拉伸到这个大小,拉伸后的图像相比于原图不会有任何的裁剪。
缩放方式其二
另一种方法,就是利用后面的 fx
和 fy
,指定缩放后图像长宽相对于原图的比例。如果利用这两个参数,前面的 dsize
要写成一个不合法的形式(比如:(0, 0)
)。具体原因后面会解释。
注意,在 dsize
和 fx
中间其实隔了一个无用的 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)
来计算的,所以即使 fx
和 fy
并不是0,只要这两个计算结果中有一个是 0,也会报错。
两种方式的优先级
OpenCV 会先检查 dsize
是否合法,即图像的宽和高是否都是非 0 的。如果是,就按照这个缩放,忽略后面的 fx
和 fy
;如果不是,就按照 fx
,fy
来计算。即优先级: dsize
> fx
fy
.
另外,两种方式是独立定义的,也就是不能混着,用数值指定长却用比率指定宽。不存在 cv.resize(img, (0, 400), fx=0.42)
这种用法!
关于插值方式
最后一个参数,在 resize
函数里有 7 种可能取值,参考OpenCV文档相关页。但是我这里第 7 个参数是不存在的,或许是版本问题?最后两个参数我试过,会报错,不行。
虽然这些参数非常庞杂,但他们的插值效果却差不多,一般情况下,默认的线性插值就够用。如果非要给点建议的话,我翻译一下官网方文档的原话:
要缩小图片,一般来说最好的插值方法是 cv.INTER_AREA
,而要放大一张图片的话,一般来说效果最好的是 cv.INTER_CUBIC
(速度慢)或者 cv.INTER_LINEAR
(速度快一些但结果仍然不错)。
扩展 —— 相关函数
OpenCV 为缩放图像的大小提供了其他的选择,这里说两个函数:cv.pyrUp
和cv.pyrDown
。
这两个函数可以用于构建图像金字塔,pyrUp
可以将图像长宽均放大为原来的 2 倍,而 pyrDown
则可以将图像长宽缩小为原来的 1/2. 与 resize
不同的是,这两个函数和高斯卷积核紧密相关。pyrUp
是对图像升采样,隔行隔列插入零向量之后用高斯核卷积,而 pyrDown
则是对图像高斯卷积后隔行隔列采样。两个的卷积核成倍数关系,前者是后者的4倍。
OpenCV 图像缩放:cv.resize() 函数详解相关推荐
- OpenCV 图像卷积:cv.filter2D() 函数详解
API 照例,我们搬一下官网的 API: C++ void cv::filter2D(InputArray src,OutputArray dst,int ddepth,InputArray kern ...
- opencv cv.findContours 函数详解
函数 cv.findContours contours, hierarchy = cv.findContours( image, mode, method[, contours[, hierarchy ...
- python cv2.resize_Python OpenCV 图像缩放 cv2.resize 方法
今天是持续写作的第 42 / 100 天. 如果你有想要交流的想法.技术,欢迎在评论区留言. 本篇博客只学习一个方法,cv2.resize 即图像缩放. 取经之旅第 9 天 铺垫知识 resize 方 ...
- Python OpenCV 图像缩放 cv2.resize 方法
今天是持续写作的第 42 / 100 天. 如果你有想要交流的想法.技术,欢迎在评论区留言. 本篇博客只学习一个方法,cv2.resize 即图像缩放. 取经之旅第 9 天 铺垫知识 resize 方 ...
- opencv: 图像缩放(cv2.resize)
Syntax cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst interpolation 选项 所用的插值方法 INT ...
- OpenCV-Python图像直方图计算calcHist函数详解、示例及图形呈现
☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在前面几篇直方图相关的文章中介绍了直方图均衡.直方图匹配.局部直方图处理.基 ...
- [转载] OpenCV-Python图像位与运算bitwise_and函数详解
参考链接: Python中的numpy.bitwise_and ☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.概述 图像的与运算主要 ...
- OpenCV-Python图像位与运算bitwise_and函数详解
☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░ 一.概述 图像的与运算主要用于获取某个图像中感兴趣的部分,是针对两个图像矩阵数组或一个数组 ...
- resize函数详解
resize函数的形式 void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int i ...
最新文章
- android weight(权重)的具体分析
- 三个管脚的压电陶瓷片
- 优秀的PHP程序员至少应该了解PHP代码的优缺点(转)
- C++重载、覆盖和遮蔽
- 数学建模论文写作小技巧分享
- 电子商务应用课程知识整理 第二章-电子商务相关知识与技术
- 第30课 棋盘上的学问 《小学生C++趣味编程》
- 如何才能在大数据中获取价值
- J.U.C并发框架源码阅读(二)AbstractQueuedSynchronizer
- /var/spool/clientmqueue/下的大文件
- java和python互相调用
- 国际版(英文版)Skype使用国内卡打电话(转)
- Maxima 的基本微积分操作(链接)
- ODC预制光纤连接器
- (二)postman批量执行用例
- ubuntu自动同步时间
- 语音信号处理 | Python实现端点检测
- 【天嵌使用教程】嵌入式主板VS2008开发windows C#基本流程
- python词语匹配相似度_python文本相似度计算
- PCL 点云的旋转与平移
热门文章
- spring集成jpa【为什么有 persistant.xml 文件呢?】
- 第7章 C语言的递归函数 (六)
- 无法打开计算机上的event log服务,解决Win7 Windows Event Log服务无法启动问题
- 论坛热贴 | RT-Thread音频驱动开发(一)
- 【一周AI新鲜事】“擎天柱”霸气登场/全球创新指数中国排名11位/摩尔定律死了,又活了?...
- 2022.12.29单词打卡
- 戴尔服务器磁盘阵列及坏道修复
- Lucene sort 排序
- ASEMI肖特基二极管MBR20200FCT特征,MBR20200FCT应用
- UML序列图 - 示例总汇