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

article/2025/9/24 17:51:09

目录

  • 系列前言
  • 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 的参数。把各个参数的含义和相关信息打一张表:

参数类型是否必须指定具体含义
srcnumpy.ndarray原图像
dsizetuple<int>缩放后的图像大小
dst无所谓目标图像,但是在 Python 里面没有任何意义。一般不传参或者设成 None
fx, fy数值类型x 和 y 方向上的缩放比例
interpolationint插值方式表示代码,本质是一个 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 300resize 函数就会将图像拉伸到这个大小,拉伸后的图像相比于原图不会有任何的裁剪。

resize1

缩放方式其二

另一种方法,就是利用后面的 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,也会报错。

resize2

两种方式的优先级

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

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


http://chatgpt.dhexx.cn/article/w4Q0Uell.shtml

相关文章

安卓中的几种线程间通信方式

一&#xff1a;Handler实现线程间的通信 andriod提供了 Handler 和 Looper 来满足线程间的通信。例如一个子线程从网络上下载了一副图片&#xff0c;当它下载完成后会发送消息给主线程&#xff0c;这个消息是通过绑定在主线程的Handler来传递的。 在Android&#xff0c;这里的…

Java中的线程通信的几种方式

Java中的线程间通信是指不同线程之间相互协作&#xff0c;以完成一些复杂的任务或实现某些功能的过程。线程间通信主要包括两个方面&#xff1a;线程之间的互斥和同步&#xff0c;以及线程之间的数据共享和通信。Java提供了多种方式来实现线程间通信&#xff0c;本文将介绍Java…

创建线程的四种方式 线程通信

文章目录 1.1 创建线程1.1.1 创建线程的四种方式1.1.2 Thread类与Runnable接口的比较1.1.3 Callable、Future与FutureTask 1.2 线程组和线程优先级1.3 Java线程的状态及主要转化方法1.4 Java线程间的通信1.4.1 等待/通知机制1.4.2 信号量1.4.3 管道 1.1 创建线程 1.1.1 创建线…

【多线程间几种通信方式】

一、使用 volatile 关键字 基于 volatile 关键字来实现线程间相互通信是使用共享内存的思想。大致意思就是多个线程同时监听一个变量&#xff0c;当这个变量发生变化的时候 &#xff0c;线程能够感知并执行相应的业务。这也是最简单的一种实现方式 代码案例 package com.han…

线程之间的通信方式

前言 我只是个搬运工&#xff0c;尊重原作者的劳动成果&#xff0c;本文来源下列文章链接&#xff1a; https://zhuanlan.zhihu.com/p/129374075 https://blog.csdn.net/jisuanji12306/article/details/86363390 线程之间为什么要通信&#xff1f; 通信的目的是为了更好的协…

Java线程间的通信方式

文章目录 线程间通信的定义一、等待—通知&#xff08;1&#xff09;等待—通知机制的相关方法&#xff1a;&#xff08;2&#xff09;注意事项&#xff1a;&#xff08;4&#xff09;notify()方法的核心原理&#xff08;5&#xff09;等待—通知机制的经典范式&#xff08;6&a…

线程间实现通信的几种方式

目录 线程通信相关概述提出问题方式一&#xff1a;使用Object类的wait() 和 notify() 方法方式二&#xff1a;Lock 接口中的 newContition() 方法返回 Condition 对象&#xff0c;Condition 类也可以实现等待/通知模式方法三&#xff1a;使用 volatile 关键字方法四&#xff1a…

线程间的通信方式

对共享数据进行更改的时候&#xff0c;先到主内存中拷贝一份到本地内存中&#xff0c;然后进行数据的更改&#xff0c;再重新将数据刷到主内存&#xff0c;这中间的过程&#xff0c;其他线程是看不到的。 1、为什么需要线程通信 线程是操作系统调度的最小单位&#xff0c;有自…

进程和线程的几种通信方式

进程之间通信的几种方式 1. 管道&#xff1a;是内核里面的一串缓存 管道传输的数据是单向的&#xff0c;若相互进行通信的话&#xff0c;需要进行创建两个管道才行的。 2. 消息队列&#xff1a; 例如&#xff0c;A进程给B进程发送消息&#xff0c;A进程把数据放在对应的消息队…

线程的几种通信方式

目录 一、Object的wait()、notify()、notifyAll()方法 二、Condition的await()、signal()、signalAll()方法 三、CountDownLatch 四、CyclicBarrier 五、Semaphore 线程间的通信方式常用的有如下几种&#xff1a; Object的wait()、notify()、notifyAll()方法&#xff1b; …

线程间的通信方法

线程间的通信方法 1. 线程通信简介 一般而言&#xff0c;在一个应用程序&#xff08;即进程&#xff09;中&#xff0c;一个线程往往不是孤立存在的&#xff0c;常常需要和其它线程通信&#xff0c;以执行特定的任务。如主线程和次线程&#xff0c;次线程与次线程&#xff0c…

Matlab基本操作函数 abs函数

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; 1、abs函数&#xff1a;数值的绝对值和复数…

MATLAB中FFT的整理

作为一个资深的健忘症患者&#xff0c;需要把每次用都忘记的FFT问题进行整理。 FFT可将信号从时域转换到频域。 首先是一些简单常识&#xff1a; 采样周期&#xff1a;两次采样之间的时间间隔。 采样频率&#xff1a;1/采样周期。每秒采样的点数。&#xff08;注意&#xff1a…

matlab中abs函数,matlababs是什么意思 是是是什么意思

matlababs是什么意思 是是是什么意思以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! matlab 中的abs函数什么意思 编程知识 matlab中的abs(x)是去绝对值的函数 例如:x=-1.23 abs(x) ans 1.23 以上即是取了-1.23…

Matlab 用法

MATLAB基础&#xff1a; 清除命令 clc 清空命令行的命令 clf 清除当前figure中的内容 clear 清除工作区变量 close all 关闭所有图形窗口 清除命令通常放在代码最前方&#xff0c;避免其他变量或代码的干扰 变量命名规则 ①以英文字母开头&#xff0c;可包含英文字母、…

abs 三种功能及代码详解 matlab函数

1.abs函数功能 求实数的绝对值、复数的模、字符串的ASCII值 2.基本用法 abs(x)函数是对数组元素进行绝对值处理的函数。 函数的定义域包括复数。 对于复数xab*i&#xff0c;有abs(x)sqrt(a2b2)。 3.代码 clc; clear all;a -7; b 12i; abs(a…

android 屏幕坐标总结

android 屏幕坐标好多个&#xff0c;有时候傻傻分不清楚&#xff0c;经常记错&#xff0c;然后只能一个个试。尴尬&#xff5e;&#xff5e; 把它们总结下来&#xff0c;以备不时之需嘿嘿。 一、视图坐标 最外面一层是屏幕&#xff0c;左上角是坐标原点&#xff0c;向右向…

【Unity3D】世界坐标与屏幕坐标

Unity3D由于是在三维世界中编程&#xff0c;而最终的结果是需要反馈到肉眼所示的2D屏幕之上的。这就产生了一种比较需要考虑的问题&#xff0c;尤其在一些涉及屏幕与Unity3D的3D世界交互的情况。网络上对于这方面的文字&#xff0c;大部分罗列了许许多多文字与代码或者API&…

Unity世界坐标转换屏幕坐标(测试)

下面展示一下上一篇说的两种实现方式打包文件在不同分辨率下的效果 1.WorldToScreenPoint 1920 * 1080 800 * 600 2.WorldToViewportPoint 1920 * 1080 800 * 600 总结 可以看到四种情况全部都显示正确&#xff0c;我们再看一下原来的代码 public Vector3 GetScreenPositio…

Unity 屏幕坐标转UI坐标

1&#xff1a;屏幕坐标转UI坐标 首先我们来明确下三个坐标概念&#xff1a; 世界坐标&#xff1a;指的是Transform组件的position字段 UI坐标&#xff1a;指的是RectTransform组件的anchoredPosition字段 屏幕坐标&#xff1a;指的是屏幕空间的坐标 (也可以说是相机空间的坐…