当前位置: 首页 > news >正文

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

☞ ░ 前往老猿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 np

from opencvPublic import preparePreviewImg,previewImgList,readImgFile,cmpMatrix

def 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/111351901
    smallImg = 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 = mi
        imgM = 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 = mi

        imgM = 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博文目录 ░

相关文章:

  • Python3装饰器的隐秘角落
  • 一种利用Python库解决视频课程检测窗口是否活动的简单方法
  • 人工智能数学基础6:极限、极限运算、ε-δ语言、ε-N语言、级数和函数连续性
  • 人工智能数学基础专栏目录
  • 人工智能数学基础8:两个重要极限及夹逼定理
  • 人工智能数学基础9:集合相关概念
  • 人工智能数学基础10:域、函数及相关概念
  • 人工智能数学基础-线性代数1:向量及向量加减法与数乘
  • 人工智能数学基础-线性代数2:向量的点积、內积、数量积和外积
  • 人工智能数学基础-线性代数3:线性空间、线性相关及基
  • 请大家支持老猿参加2020年博客之星年度评选,谢谢!
  • 人工智能数学基础-线性代数4:矩阵及矩阵运算
  • 人工智能数学基础-线性代数5:行列式求解线性方程组和拉普拉斯定理
  • Python爬虫入门1:序章
  • Python爬虫入门2:HTML知识简介
  • angular学习第一篇-----环境搭建
  • echarts的各种常用效果展示
  • JavaScript 奇技淫巧
  • Linux编程学习笔记 | Linux IO学习[1] - 文件IO
  • pdf文件如何在线转换为jpg图片
  • Windows Containers 大冒险: 容器网络
  • 入手阿里云新服务器的部署NODE
  • 微信开源mars源码分析1—上层samples分析
  • Java性能优化之JVM GC(垃圾回收机制)
  • UI设计初学者应该如何入门?
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #LLM入门|Prompt#3.3_存储_Memory
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • (06)金属布线——为半导体注入生命的连接
  • (1)SpringCloud 整合Python
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (Matlab)使用竞争神经网络实现数据聚类
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (一)插入排序
  • (转)创业家杂志:UCWEB天使第一步
  • (转)甲方乙方——赵民谈找工作
  • ******之网络***——物理***
  • .bat批处理出现中文乱码的情况
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • .NET Core SkiaSharp 替代 System.Drawing.Common 的一些用法
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET 中 GetProcess 相关方法的性能
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .net实现客户区延伸至至非客户区
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /dev下添加设备节点的方法步骤(通过device_create)
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解