opencv的resize函数

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

一、Opencv官方文档中resize的描述:

resize
Resizes an image.

C++: void resize(InputArray src, OutputArray dst, Size dsize, double fx=0, double fy=0, int interpolation=INTER_LINEAR )

Python: cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst

C: void cvResize(const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR )

Python: cv.Resize(src, dst, interpolation=CV_INTER_LINEAR) → None
Parameters:
src – Source image.
dst – Destination image. It has the size dsize (when it is non-zero) or the size computed from src.size() , fx , and fy . The type of dst is the same as of src .
dsize –
Destination image size. If it is zero, it is computed as:

//在下文fx和fy的计算方式中可以看到,fx表达横向的放缩倍数,fy表达纵向的放缩倍数,dsize表达放缩后的图像的横和纵向长度
dsize = Size(round(fxsrc.cols), round(fysrc.rows))

Either dsize or both fx and fy must be non-zero.

fx –
Scale factor along the horizontal axis. When it is 0, it is computed as

(double)dsize.width/src.cols
//fx表达横向的放缩倍数

fy –
Scale factor along the vertical axis. When it is 0, it is computed as

(double)dsize.height/src.rows
//fy表达纵向的放缩倍数

interpolation –
Interpolation method:

INTER_NEAREST - a nearest-neighbor interpolation
INTER_LINEAR - a bilinear interpolation (used by default)
INTER_AREA - resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
INTER_CUBIC - a bicubic interpolation over 4x4 pixel neighborhood
INTER_LANCZOS4 - a Lanczos interpolation over 8x8 pixel neighborhood
The function resize resizes the image src down to or up to the specified size. Note that the initial dst type or size are not taken into account. Instead, the size and type are derived from the src,dsize,fx , and fy . If you want to resize src so that it fits the pre-created dst , you may call the function as follows:

// explicitly specify dsize=dst.size(); fx and fy will be computed from that.
resize(src, dst, dst.size(), 0, 0, interpolation);
If you want to decimate the image by factor of 2 in each direction, you can call the function this way:

// specify fx and fy and let the function compute the destination image size.
resize(src, dst, Size(), 0.5, 0.5, interpolation);
To shrink an image, it will generally look best with CV_INTER_AREA interpolation, whereas to enlarge an image, it will generally look best with CV_INTER_CUBIC (slow) or CV_INTER_LINEAR (faster but still looks OK).

See also warpAffine(), warpPerspective(), remap()

二、使用该函数:

1、原图:shape=(333,500,3)
特意选了绿色的鸟,我喜欢绿色的鸟

2、将图像按比例缩小:

import cv2img = cv2.imread("bird.jpg")
height, width, channel = img.shapesize_decrease = (int(width/2), int(height/2))
img_decrease = cv2.resize(img,size_decrease,interpolation=cv2.INTER_CUBIC)
cv2.imwrite("bird_decrease.jpg",img_decrease)

在这里插入图片描述

3、将图像按比例放大:

import cv2img = cv2.imread("bird.jpg")
height, width, channel = img.shapesize_increase = (int(width*2), int(height*2))
img_increase = cv2.resize(img,size_increase,interpolation=cv2.INTER_CUBIC)
cv2.imwrite("bird_increase.jpg",img_increase)

在这里插入图片描述

4、按照指定大小缩小:

img_required_dec = cv2.resize(img,(200,150),interpolation=cv2.INTER_CUBIC)
cv2.imwrite("bird_required_dec.jpg", img_required_dec)

在这里插入图片描述

5、按照指定大小放大:

img_required_inc = cv2.resize(img, (600,500),interpolation=cv2.INTER_CUBIC)
cv2.imwrite("bird_required_inc.jpg", img_required_inc)

在这里插入图片描述

三、探究interpolation参数的不同形式对resize结果的影响:
1、INTER_NEAREST:

img_NEAREST = cv2.resize(img,(img.shape[1],img.shape[0]),interpolation=cv2.INTER_NEAREST)cv2.imwrite("bird_NEAREST.jpg", img_NEAREST)

2、INTER_LINEAR:

img_LINEAR = cv2.resize(img,(img.shape[1],img.shape[0]),interpolation=cv2.INTER_LINEAR)cv2.imwrite("bird_LINEAR.jpg", img_LINEAR)

3、INTER_AREA:

img_AREA = cv2.resize(img,(img.shape[1],img.shape[0]),interpolation=cv2.INTER_AREA)cv2.imwrite("bird_AREA.jpg", img_AREA)

4、INTER_CUBIC:

img_CUBIC = cv2.resize(img,(img.shape[1],img.shape[0]),interpolation=cv2.INTER_CUBIC)cv2.imwrite("bird_CUBIC.jpg", img_CUBIC)

5、INTER_LANCZOS4:

img_LANCZOS4 = cv2.resize(img,(img.shape[1],img.shape[0]),interpolation=cv2.INTER_LANCZOS4)cv2.imwrite("bird_LANCZOS4.jpg", img_LANCZOS4)

结论:肉眼看没有什么区别

三、opencv官方文档中对不同形式的interpolation进行解读:
1、INTER_NEAREST:
最近邻插值
2、INTER_LINEAR:
线性插值(默认使用)
3、INTER_AREA:
利用像素区域关系进行重新采样。因为它给出了moire’-free的结果,所以在图像抽取(decimation)中更偏向于使用它。但是在图像放大(zoomed)中,它和INTER_NEAREST方式比较相似。
4、INTER_CUBIC:
在4x4像素邻域中bicubic插值
5、INTER_LANCZOS4:
在8x8像素邻域中Lanczos插值

四、该函数使用的注意事项:
1、dsize的数据类型必须为Integer
2、.jpg格式的图像使用cv2的imread读取后,其shape形式为(height,width,channel)
3、cv2的resize函数使用的dsize其格式为(width,height),和读取格式相反

五、疑问:
1、在opencv官方文档中,cv.resize函数返回值为None。但是实际使用中,resize函数返回了改变大小后的图像。为什么会有这样的不同?(见更新)
2、cv.resize的参数为src,dst,dsize,fx,fy,interpolation,这些参数是可选的吗?比如,设定了fx和fy后就可以不必设定dsize吗?
3、各个插值方式的细节、使用场景以及为什么要选择该插值方式。

更新:
1、在Opencv官方文档中,给出了C、C++、Python三种语言的同一函数的不同形式。其中,Python给出了两种形式:
(1)cv.Resize:

Python: cv.Resize(src, dst, interpolation=CV_INTER_LINEAR) → None

该函数是被官方文档标注Legacy Python fuction,是opencv的遗留函数,已经不再使用了,其返回值为None

(2)cv2.resize:

Python: cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst

是cv.Resize更新后的函数,返回值是dst,不是None

在opencv官方文档中,cv.Resize函数返回值为None;cv2.Resize函数返回值是dst。实际使用的是cv2.resize,该函数的返回值为resize后的图像。

2、opencv官方文档中的search很好用!(like


http://chatgpt.dhexx.cn/article/3XPTOIXP.shtml

相关文章

resize()函数

resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设置容器容量大小,但并没有真正分配内存。 打个比方:正在建造…

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

目录 系列前言API函数详解参数列表缩放方式其一缩放方式其二两种方式的优先级关于插值方式 扩展 —— 相关函数 系列前言 这个系列是我第一个想要更下去的系列。每篇会全面介绍一个 OpenCV 函数,会给出 API 和示例。示例主要是用 Python 去写,但是 Open…

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

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

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

Java中的线程间通信是指不同线程之间相互协作,以完成一些复杂的任务或实现某些功能的过程。线程间通信主要包括两个方面:线程之间的互斥和同步,以及线程之间的数据共享和通信。Java提供了多种方式来实现线程间通信,本文将介绍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 关键字来实现线程间相互通信是使用共享内存的思想。大致意思就是多个线程同时监听一个变量,当这个变量发生变化的时候 ,线程能够感知并执行相应的业务。这也是最简单的一种实现方式 代码案例 package com.han…

线程之间的通信方式

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

Java线程间的通信方式

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

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

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

线程间的通信方式

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

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

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

线程的几种通信方式

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

线程间的通信方法

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

Matlab基本操作函数 abs函数

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

MATLAB中FFT的整理

作为一个资深的健忘症患者,需要把每次用都忘记的FFT问题进行整理。 FFT可将信号从时域转换到频域。 首先是一些简单常识: 采样周期:两次采样之间的时间间隔。 采样频率:1/采样周期。每秒采样的点数。(注意&#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基础: 清除命令 clc 清空命令行的命令 clf 清除当前figure中的内容 clear 清除工作区变量 close all 关闭所有图形窗口 清除命令通常放在代码最前方,避免其他变量或代码的干扰 变量命名规则 ①以英文字母开头,可包含英文字母、…

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

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

android 屏幕坐标总结

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

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

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