python-opencv实现最近邻插值和双线性插值对图片上采样

使用背景

当我们需要把图像进行放大或者缩小的时候,第一反应是使用resize()实现。很多情况下,我们会调用最近邻插值和双线性插值去放大图片,当然要说没有分辨率的损失那是不可能的,只能说在放大图片的过程中尽可能增加了图片的分辨率。这里介绍这两种放大图片尺寸的方法代码,并说明其中优缺点同时看效果,最后再做一个对比和总结。

- 最近邻插值方法

- 双线性插值方法

- 总结

为了更好的展现出插值方法的效果,先利用切边操作把图片设置为(350,350)大小,再各利用插值法把图片的height和weigth各扩大一倍为(700,700),之后比较原始图片和使用了插值方法图片的分辨率或者说清晰度。切片值设置因图而异。代码如下。

img=cv2.imread(r'C:\Users\ZFG\PycharmProjects\Lenet_test\orinal.jpg')
print(img.shape[:2])  #输出为(1491, 1080)
img=img[650:1000,200:550]
print(img.shape[:2])  #输出为(350, 350)
cv2.imwrite(r'C:\Users\ZFG\PycharmProjects\Lenet_test\test.jpg',img) #保存图片在命名为test
cv2.imshow('orinal',img)
cv2.waitKey(0)

最近邻插值方法

代码如下所示可以实现:

import numpy as np
import cv2def function(img):height,width,channels=img.shape #获得高宽三颜色通道三个值empty=np.zeros((700,700,channels),np.uint8)  #设置一个(700,700)大小的三维0数组sh=700/heightsw=700/widthfor i in range(700):for j in range(700):x=int(i/sh)y=int(j/sw)empty[i,j]=img[x,y]return emptyimg=cv2.imread(r'C:\Users\ZFG\PycharmProjects\Lenet_test\test.jpg')
cv2.imshow('origin',img)
zoom=function(img)
cv2.imshow('bigger1',zoom)
cv2.waitKey(0)

最后结果如下图所示:

结论:

  • 优点:算法容易实现,时空复杂度较小,运行较快
  • 缺点:放大后轮廓锯齿状较多,效果一般

双线性插值方法

代码如下所示可以实现:

import numpy as np
import cv2def bilinear_interpolation(img,out):  #out为希望输出大小src_h, src_w, channel = img.shape  #获取三通道dst_h, dst_w = out[1], out[0]if src_h == dst_h and src_w == dst_w:return img.copy()dst_img = np.zeros((dst_h,dst_w,3),dtype=np.uint8)scale_x, scale_y = float(src_w) / dst_w, float(src_h) / dst_hfor i in range(3):for dst_y in range(dst_h):for dst_x in range(dst_w):# find the origin x and y coordinates of dst image x and y# use geometric center symmetry# if use direct way, src_x = dst_x * scale_xsrc_x = (dst_x + 0.5) * scale_x - 0.5src_y = (dst_y + 0.5) * scale_y - 0.5# find the coordinates of the points which will be used to compute the interpolationsrc_x0 = int(np.floor(src_x))src_x1 = min(src_x0 + 1 ,src_w - 1)src_y0 = int(np.floor(src_y))src_y1 = min(src_y0 + 1, src_h - 1)# calculate the interpolationtemp0 = (src_x1 - src_x) * img[src_y0,src_x0,i] + (src_x - src_x0) * img[src_y0,src_x1,i]temp1 = (src_x1 - src_x) * img[src_y1,src_x0,i] + (src_x - src_x0) * img[src_y1,src_x1,i]dst_img[dst_y,dst_x,i] = int((src_y1 - src_y) * temp0 + (src_y - src_y0) * temp1)return dst_imgif __name__ == '__main__':img = cv2.imread(r'C:\Users\ZFG\PycharmProjects\Lenet_test\test.jpg')cv2.imshow('orinal',img)dst = bilinear_interpolation(img,(700,700))cv2.imshow('test',dst)cv2.waitKey()

最后结果如下图所示:

结论:

  • 优点:图像几乎不失真,放大后分辨率也非常高
  • 缺点:算法不易实现,时空复杂度大,运行很慢,对CPU要求较高,大批处理耗费算力大

总结

在实际操作中,选用最近邻插值方法和双线性插值方法的时候,不需要这么多源码实现,只需要在resize()的时候调用opencv-cv2的方法就可以实现方法。如resize(img,(700,700),cv2.INTER_NEAREST)为最近邻插值法,resize(img,(700,700),cv2.INTER_LINEAR)为双线性插值法。在实际过程中,需要高分辨率则用双线性插值法,但是这样需要耗费较多CPU,选用最近邻插值法运行很快但是图像有些许失真。所以具体选用哪种方法,根据实际情况衡量好精度和算力。

  • 注:由于图片本身分辨率不高,所以看上去可能区别不大,但是对于电脑而言,在进行识别或者分割等操作时,差别还是很大的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/314371.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React复习笔记

基础语法 创建项目 借助脚手架,新建一个React项目(可以使用vite或者cra,这里使用cra) npx create-react-app 项目名 create-react-app是React脚手架的名称 启动项目 npm start 或者 yarn start src是源文件index.js相当于Vue的main.js文件。整个…

C语言:一维数组、二维数组、字符数组介绍

数组 介绍一维数组定义应用方法初始化 举例示例结果 二维数组定义应用方法初始化 举例示例结果 字符数组定义应用方法初始化 举例示例结果分析 介绍 在C语言中,数组是一种基本的数据结构,用于存储一系列相同类型的数据。数组可以是多维的,最…

【嵌入式】Arduino IDE + ESP32开发环境配置

一 背景说明 最近想捣鼓一下ESP32的集成芯片,比较了一下,选择Arduino IDE并添加ESP32支持库的方式来开发,下面记录一下安装过程以及安装过程中遇到的坑。 二 下载准备 【1】Arduino IDE ESP32支持一键安装包(非常推荐&#xff0…

miniTry:Python实现web搜索(全自动+程序操控)

声明:本问给出了全部代码--可以复现--亲测有效 :) [ 代码为图片--> 强制自己去敲一次 又不多] 1.打开网站: 2.利用id去定位到我们要进行输入的内容(bing可以直接进行搜索,而csdn需要登录,所以我们用csdn做演示&…

python 使用flask_httpauth和pyjwt实现登录权限控制

最近需要用到,学习了一下记录 首先安装依赖 pip install Flask-HTTPAuth pyjwt passlib Welcome to Flask-HTTPAuth’s documentation! — Flask-HTTPAuth documentation Welcome to PyJWT — PyJWT 2.8.0 documentation Passlib 1.7.4 documentation — Passl…

Java8 Stream常见用法

Stream流的常见用法&#xff1a; 1.利用stream流特性把数组转list集合 //定义一个数组Integer[] array {5,2,1,6,4,3};//通过stream特性把数组转list集合List<Integer> list Arrays.stream(array).collect(Collectors.toList());//打印结果System.out.println(list);…

Docker深入探索:网络与资源控制、数据管理与容器互联以及镜像生成

目录 一、 Docker网络 &#xff08;一&#xff09;Docker网络实现原理 &#xff08;二&#xff09;Docker网络模式 1. Bridge网络&#xff08;默认&#xff09; 2. Host网络 3. None网络 4. Container网络 5. 自定义网络 二、资源控制 &#xff08;一&#xff09;cgr…

从递归角度串联二叉树-图论-动态规划

一、深度理解二叉树的前中后序遍历 二叉树遍历框架如下&#xff1a; void traverse(TreeNode* root) {if (root nullptr) {return;}// 前序位置traverse(root->left);// 中序位置traverse(root->right);// 后序位置 }先不管所谓前中后序&#xff0c;单看 traverse 函数…

分布式与一致性协议之CAP(五)

CAP 理论 如何使用BASE理论 以InfluxDB系统中DATA节点的集群实现为例。DATA节点的核心功能是读和写&#xff0c;所以基本可用是指读和写的基本可用。我们可以通过分片和多副本实现读和写的基本可用。也就是说&#xff0c;将同一业务的数据先分片&#xff0c;再以多份副本的形…

Rust中的函数指针

什么是函数指针 通过函数指针允许我们使用函数作为另一个函数的参数。函数的类型是 fn &#xff08;使用小写的 ”f” &#xff09;以免与 Fn 闭包 trait 相混淆。fn 被称为 函数指针&#xff08;function pointer&#xff09;。指定参数为函数指针的语法类似于闭包。 函数指…

如何在TestNG中忽略测试用例

在这篇文章中&#xff0c;我们将讨论如何在TestNG中忽略测试用例。TestNG帮助我们忽略使用Test注释的情况&#xff0c;我们可以在不同的级别上忽略这些情况。 首先&#xff0c;只忽略一个测试方法或测试用例。第二&#xff0c;忽略一个类及其子类中的所有情况。第三个是&#…

【深度学习】YOLOv5,烟雾和火焰,目标检测,防火检测,森林火焰检测

文章目录 数据收集和数据标注查看标注好的数据的脚本下载yolov5创建 dataset.yaml训练参数开始训练yolov5n训练训练后的权重下载gradio部署 数据收集和数据标注 搜集数据集2w张。 pip install labelme labelme 然后标注矩形框和类别。 下载数据请看这里&#xff1a; https:…

图像处理之Retinex算法(C++)

图像处理之Retinex算法&#xff08;C&#xff09; 文章目录 图像处理之Retinex算法&#xff08;C&#xff09;前言一、单尺度Retinex&#xff08;SSR&#xff09;1.原理2.代码实现3.结果展示 二、多尺度Retinex&#xff08;MSR&#xff09;1.原理2.代码实现3.结果展示 三、带色…

【01-机器学习入门:理解Scikit-learn与Python的关系】

文章目录 前言Python与机器学习Scikit-learn简介Scikit-learn与Python的关系使用Scikit-learn进行机器学习结语 前言 在当今的数据科学和人工智能领域&#xff0c;机器学习已经成为了一个不可或缺的组成部分。而对于那些刚刚踏入这一领域的新手来说&#xff0c;理解机器学习的基…

线性代数 --- 矩阵的对角化以及矩阵的n次幂

矩阵的对角化以及矩阵的n次幂 &#xff08;特征向量与特征值的应用&#xff09; 前言&#xff1a; 在上一篇文章中&#xff0c;我记录了学习矩阵的特征向量和特征值的学习笔记&#xff0c;所关注的是那些矩阵A作用于向量x后&#xff0c;方向不发生改变的x(仅有尺度的缩放)。线…

Xilinx 7系列中clock IP核通过AXI4-Lite接口实现动态重新配置

当选择了动态重配置&#xff08;Dynamic Reconfiguration&#xff09;选项时&#xff0c;AXI4-Lite接口将默认被选中用于重新配置时钟组件。动态重新配置可以通过AXI4-Lite接口实现了Clocking Wizard IP核的时钟组件MMCM/PLL的动态重新配置。 如果需要直接访问MMCM/PLL的DRP寄…

C++ 头文件/宏冲突问题解决?如何解决?

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

SpringBoot + kotlin 协程小记

前言&#xff1a; Kotlin 协程是基于 Coroutine 实现的&#xff0c;其设计目的是简化异步编程。协程提供了一种方式&#xff0c;可以在一个线程上写起来像是在多个线程中执行。 协程的基本概念&#xff1a; 协程是轻量级的&#xff0c;不会创建新的线程。 协程会挂起当前的协…

【软件】ERETCAD-Env:在轨空间环境3D动态仿真软件

文章介绍了Extreme-environment Radiation Effect Technology Computer-Aided Design – Environment (ERETCAD-Env)软件&#xff0c;文章的介绍和展示了ERETCAD-Env软件的功能和特点&#xff0c;这是一款用于动态模拟在轨卫星所处空间环境的计算机辅助设计软件。强调了该软件在…

如何在CentOS本地搭建DataEase数据分析服务并实现远程查看数据分析

文章目录 前言1. 安装DataEase2. 本地访问测试3. 安装 cpolar内网穿透软件4. 配置DataEase公网访问地址5. 公网远程访问Data Ease6. 固定Data Ease公网地址 前言 DataEase 是开源的数据可视化分析工具&#xff0c;帮助用户快速分析数据并洞察业务趋势&#xff0c;从而实现业务…