OpenCV-Python图像处理:插值方法及使用resize函数进行图像缩放

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

☞ ░ 前往老猿Python博客 https://blog.csdn.net/LaoYuanPython ░

图像缩放用于对图像进行缩小或扩大,当图像缩小时需要对输入图像重采样去掉部分像素,当图像扩大时需要在输入图像中根据算法生成部分像素,二者都会利用插值算法来实现。

一、支持的插值算法说明

OpenCV支持的插值算法包括如下表格中的前6种,后面几种不是插值算法,而是补充的标记:
在这里插入图片描述
相关插值算法比较(参考《OpenCV图像缩放resize各种插值方式的比较》):

  • 速度比较:INTER_NEAREST(最近邻插值)>INTER_LINEAR(线性插值)>INTER_CUBIC(三次样条插值)>INTER_AREA (区域插值)
  • 对图像进行缩小时,为了避免出现摩尔纹现象,推荐采用INTER_AREA 区域插值方法
  • 要放大图像,通常使用INTER_CUBIC(速度较慢,但效果最好),或者使用INTER_LINEAR(速度较快,效果还可以)。至于最近邻插值INTER_NEAREST,一般不推荐使用

关于具体算法的介绍请参考以下资料:

  • 关于线性插值的介绍老猿觉得最容易懂的是知乎上的《【数学】线性插值》上的介绍,简单易懂地介绍了线性插值、双线性插值、双三次插值。
  • 关于最邻近插值和双线性插值的原理可以参考《OpenCV2:图像的几何变换,平移、镜像、缩放、旋转(1)》
  • 关于兰索斯插值请参考《Lanczos插值,最邻近插值,双线性二次插值,三次插值》
  • 《OpenCV图像缩放resize各种插值方式的比较》
  • 《OpenCV中resize函数五种插值算法的实现过程》,使用C语言实现了五种插值算法
  • 《OpenCV插值算法原理》介绍了最邻近插值和双线性插值的原理。

二、缩放函数resize介绍

2.1、调用语法

图像缩放使用函数resize,可以将图像按照指定大小或缩放因子进行缩放。
dst = resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

2.2、参数及返回值说明

  • src:输入图像
  • dsize:缩放到的目标图像大小
  • dst:目标图像, 不需要考虑dst的初始大小,目标图像的初始大小是dsize或fx和fy指定的,如果需要按照dst的大小来确认结果图像大小,需要先将dst对应大小赋值给dsize
  • fx:水平方向即宽度的缩放因子,如果为0,则fx=dsize.width/src.cols,类型为带小数位的数字
  • fy:竖直方向即高度的缩放因子,如果为0,则fy=dsize.height/src.rows,类型为带小数位的数字
  • interpolation:插值方法
  • 返回值:缩放后的图像
注意:

经测试验证:

  1. dsize和fx/ fy二者必须指定一个,如果二者都指定,以dsize为准,fx/ fy被忽略;
  2. 图像缩放时未指定插值算法的结果与插值算法为INTER_LINEAR的结果相同

三、案例

下面的案例是读取两张大小不同的图像,相互参照以各种插值方法进行缩放,并比较哪种插值方法和不带插值实参的结果一致:

代码:
import cv2
import numpy as npfrom opencvPublic import preparePreviewImg,previewImgList,readImgFile,cmpMatrixdef main(largeImg,smallImg):interMethod = [cv2.INTER_NEAREST,cv2.INTER_LINEAR,cv2.INTER_CUBIC,cv2.INTER_AREA,cv2.INTER_LANCZOS4,cv2.INTER_LINEAR_EXACT]interMethodInf = ['INTER_NEAREST', 'INTER_LINEAR', 'INTER_CUBIC', 'INTER_AREA', 'INTER_LANCZOS4','INTER_LINEAR_EXACT']information = "老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号"largeImg = readImgFile(largeImg, False) #自定义读入图片文件的函数,具体功能请参考:https://blog.csdn.net/LaoYuanPython/article/details/111351901smallImg = readImgFile(smallImg, False)preparePreviewImg('largeImg',largeImg)preparePreviewImg('smallImg', smallImg)imgNoInterMethod = cv2.resize(smallImg,largeImg.shape[0:2])preparePreviewImg('未指定放大算法' , imgNoInterMethod)for mi in zip(interMethod,interMethodInf):m,i = miimgM = cv2.resize(smallImg,largeImg.shape[0:2],fx=0.8,fy=0.8,interpolation=m)preparePreviewImg('放大算法:'+i, imgM)if cmpMatrix(imgNoInterMethod,imgM):print(f"图像放大时未指定插值算法的结果与插值算法为{i}的结果相同")previewImgList()imgNoInterMethod = cv2.resize(largeImg, smallImg.shape[0:2])preparePreviewImg('未指定放大算法', imgNoInterMethod)for mi in zip(interMethod, interMethodInf):m, i = miimgM = cv2.resize(largeImg, smallImg.shape[0:2], interpolation=m )preparePreviewImg('缩小算法:' + i, imgM)if cmpMatrix(imgNoInterMethod,imgM):print(f"图像缩小时未指定插值算法的结果与插值算法为{i}的结果相同")print(f"\n更多学习资料请参考:\n    {information}")previewImgList()cv2.waitKey(0)main(r'f:\pic\咖啡狗.jpg',r'f:\pic\咖啡狗小图.JPG')

上述代码中从opencvPublic 导入的preparePreviewImg、previewImgList、readImgFile、cmpMatrix相关函数功能请参考《https://blog.csdn.net/LaoYuanPython/article/details/111351901 OpenCV-Python图形图像处理:自用的一些工具函数功能及调用语法介绍》的说明。

输出:
图像放大时未指定插值算法的结果与插值算法为INTER_LINEAR的结果相同
图像缩小时未指定插值算法的结果与插值算法为INTER_LINEAR的结果相同更多学习资料请参考:老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/109160152,敬请关注同名微信公众号
图像放大预览结果:

在这里插入图片描述
由于预览图像高度太大被缩小了,放大一点看输入的两张图像,小的在右上角很小的地方:
在这里插入图片描述
下面是未指定放大算法的结果预览图:
在这里插入图片描述
其他的图像效果差异不是很大,就不展示了。

图像缩小预览图像: 在这里插入图片描述

四、小结

本节简单介绍了与图像缩放相关的插值算法、并详细介绍OpenCV图像缩放的函数resize相关的语法、参数以及应用案例。不同的插值算法对资源的开销不同,最终效果也会不一致,大家进行图像缩放时,如无特殊要求,插值算法使用默认值即可。

更多OpenCV-Python的介绍请参考专栏《OpenCV-Python图形图像处理》相关文章。

关于老猿的付费专栏

老猿的付费专栏《使用PyQt开发图形界面Python应用》专门介绍基于Python的PyQt图形界面开发基础教程,付费专栏《moviepy音视频开发专栏》详细介绍moviepy音视频剪辑合成处理的类相关方法及使用相关方法进行相关剪辑合成场景的处理,两个专栏都适合有一定Python基础但无相关知识的小白读者学习。

付费专栏文章目录:《moviepy音视频开发专栏文章目录》、《使用PyQt开发图形界面Python应用专栏目录》。

对于缺乏Python基础的同仁,可以通过老猿的免费专栏《专栏:Python基础教程目录》从零开始学习Python。

如果有兴趣也愿意支持老猿的读者,欢迎购买付费专栏。

跟老猿学Python、学OpenCV!

☞ ░ 前往老猿Python博文目录 ░


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

相关文章

vector的resize函数和reserve函数

博客原文:C基础篇 -- vector的resize函数和reserve函数_VampirEM_Chosen_One的博客-CSDN博客,写的特别好,谢谢原博主。 正文: 对于C的vector容器模板类,存在size和capacity这样两个概念,可以分别通过vect…

OpenCV 图片尺寸缩放——resize函数

文章目录 OpenCV中的缩放:resize函数代码案例 OpenCV中的缩放: 如果要放大或缩小图片的尺寸,可以使用OpenCV提供的两种方法: resize函数,是最直接的方式;pyrUp,pyrDown函数,即图像…

OpenCV的resize函数优化

背景 在使用OpenCV做图像处理的时候,最常见的问题是c版本性能不足,以resize函数为例来说明,将size为[864,1323,3]的函数缩小一半: Mat img0;gettimeofday(&t4, NULL);cv::resize(source, img0, cv::Size(cols_out,rows_out)…

C++ | resize函数的用法

最近在leetcode用C刷题,刚遇到一题需要给重新弄一个容器,并给容器初始化。新建容器要在private类中声明resize函数用来初始化preSum容器。 resize函数是C中序列式容器的一个共性函数,vv.resize(int n,element)表示调整容器vv的大小为n&#x…

opencv的resize函数

一、Opencv官方文档中resize的描述: resize Resizes an image. C: void resize(InputArray src, OutputArray dst, Size dsize, double fx0, double fy0, int interpolationINTER_LINEAR ) Python: cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) …

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…