在不使用cv2等库的情况下利用numpy实现双线性插值缩放图像
起因
我看到了一个别人的作业,他们老师让不使用cv2等图像处理库缩放图像
算法介绍
如果你仔细看过一些库里缩放图像的方法参数会发现有很多可选项,其中一般默认是使用双线性插值。具体步骤:
- 计算目标图坐标对应原图中哪些坐标来填充
- 根据双线性插值的公式写出代码
其中缩放函数使用numpy来加快速度,使用for循环缩放图像到1024*1024我的cpu运行了36s,使用numpy运行了0.38秒快了近100倍
代码
重点在于写一个函数 def resize(src, width,height):,参数是目标图像的宽高
import cv2
import numpy as np
import time
def resize(src, width,height):
dst_w = width
dst_h = height
src_h, src_w = src.shape[:2] # 源图像宽高
if src_h == dst_h and src_w == dst_w:
return src.copy()
scale_x = float(src_w) / dst_w # x缩放比例
scale_y = float(src_h) / dst_h # y缩放比例
dst = np.zeros((dst_h, dst_w, 3), dtype=np.uint8)
下面可能比较难理解,np_src_x代表目标图像的x坐标,src_x也是代表目标图像的x坐标只是它有3个维度,是为了之后的索引做准备。从src_x_dst开始是计算目标图坐标需要哪些原始图坐标来填充。
np_src_x = np.arange(0, dst.shape[1])
np_src_y = np.arange(0, dst.shape[0]).reshape((dst.shape[0], 1))
src_x = (np_src_x + np.zeros(dst.shape[:2]))[:, :, np.newaxis] + np.zeros(dst.shape)
src_y = (np_src_y + np.zeros(dst.shape[:2]))[:, :, np.newaxis] + np.zeros(dst.shape)
# 计算目标图坐标对应的原始图坐标
src_x_dst = src_x * scale_x
src_y_dst = src_y * scale_y
srcX0 = np.floor(src_x_dst).astype(int)
srcY0 = np.floor(src_y_dst).astype(int)
srcX1 = np.minimum(srcX0 + 1, src_w - 1)
srcY1 = np.minimum(srcY0 + 1, src_h - 1)
three_axis也是为之后的索引做准备,对了,这个函数只能处理有RGB或BGR这种有3个通道的图形,其实改进应该也不难有想法的同学可以试一下。后面的value0就是具体的公式计算了
three_axis = np.zeros(dst.shape, dtype=int)
three_axis[:, :, 1] = 1
three_axis[:, :, 2] = 2
# 根据公式计算值
value0 = (srcX1 - src_x_dst) * src[srcY0, srcX0, three_axis] + (src_x_dst - srcX0) * src[srcY0, srcX1, three_axis]
value1 = (srcX1 - src_x_dst) * src[srcY1, srcX0, three_axis] + (src_x_dst - srcX0) * src[srcY1, srcX1, three_axis]
dst = ((srcY1 - src_y_dst) * value0 + (src_y_dst - srcY0) * value1).astype(np.uint8)
return dst
完整的代码在这里ScaleImage.py
这是效果图:

...缩放图像看不出来效果
在不使用cv2等库的情况下利用numpy实现双线性插值缩放图像的更多相关文章
- Oracle主库归档丢失,备库日志有gap,在不重建备库的情况下,恢复备库
本文主要描述Oracle备库日志与主库日志之间有gap,切主库这部分gap的归档日志已经删除或丢失,如何在不重建备库的情况下,恢复备库. 欢迎转载,请注明作者.出处. 作者:张正 blog:http: ...
- Python离线断网情况下安装numpy、pandas和matplotlib等常用第三方包
联网情况下在命令终端CMD中输入“pip install numpy”即可自动安装,pandas和matplotlib同理一样方法进行自动安装. 工作的电脑不能上外网,所以不能通过直接输入pip命令来 ...
- iOS 在不添加库的情况下 通过抽象类来获取自己想要的方法
#define SYSTEM_VERSION_MORE_THAN_BFDATA(v) ([[[UIDevice currentDevice] systemVersion] compare:v opti ...
- 在本地库不连接远远程库的情况下操作远程库-----sql server
--创建链接服务器 --前面都是固定不变的------q:自己随便起-----38.107.111.185:远程服务器的ip exec sp_addlinkedserver 'q', ' ', 'SQ ...
- 平板不能设置代理的情况下利用随身wifi进行http代理访问
需求来源:平板或手机是个封闭系统无法给wifi设置代理,需要利用filllder进行抓包,内容篡改等实验 拥有硬件资源:PC机器 + 小米随身wifi 方案1: NtBind Dns + Nginx ...
- Windows8.1 安装SQL Server2012——部分组件安装不成功!(提示安装.NET 3.5时出错,无Internet情况下利用win8.1安装镜像安装.NET 3.5)
虽然从事着与开发毫无关系的工作,但却也断断续续维持了近6年的WEB开发,有时因为其它工作原因,可能每做一个项目的时间间隔比较大,有时甚至在做的一个项目因为其他事情而停滞几个月之久(有些项目是自己兴趣或 ...
- 【DATAGUARD】物理dg在主库丢失归档文件的情况下的恢复(七)
[DATAGUARD]物理dg在主库丢失归档文件的情况下的恢复(七) 一.1 BLOG文档结构图 一.2 前言部分 一.2.1 导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到 ...
- 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
从10G开始,Oracle提供了一个较为轻量级的客户包,叫做Instant Client. 将它安装好后,就不用再安装庞大的Oracle Client了. 这样一来,只要客户端下载Instant Cl ...
- webservice 尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下运行,将出现此问题
最近做的项目中,应用服务器迁移到另外一台服务器,操作系统升级为win10,配置好IIS里的应用程序发布网站和Webservice网站后, 客户端程序调用Webservice出错: “尝试加载 Orac ...
- “尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。”
远程连接服务器的数据库调试WCF程序时,可以正常访问数据库,但将程序发布成站点部署在数据库所在的服务器之后,一直报错,通过try/catch捕获得到以下报错信息: System.Exception: ...
随机推荐
- 学习笔记之——C语言 函数
采用函数的原因: 随着程序规模的变大,产生了以下问题: --main函数变得相当冗杂 --程序复杂度不断提高 --代码前后关联度提高,修改代码往往牵一发而动全身 --变量使用过多,命名都成了问题 -- ...
- Ruoyi表单构建
Ruoyi表单构建通过拖动组件就能自动生成前端代码,很方便,所以本文简单通过上层函数源码来梳理一下大致流程,如有需要再自行仔细一行行分析底层代码. 组件拖动 实现组件拖动功能主要依赖第三方库:VueD ...
- 51单片机-独立按键控制led矩阵的左移和右移
51单片机学习 独立按键 控制led灯光矩阵的左移和右移 开发板采用的是普中的A2学习开发板,具体的代码如下: typedef unsigned int u16; void delay(u16 tim ...
- webpack 配置echarts 按需加载
引入babel-plugin-equire插件,方便使用.yarn add babel-plugin-equire -D 在.babelrc文件中的配置 { "presets": ...
- phpexcel 上传
<?php require_once(ROOTPATH . "inc/PHPExcel/PHPExcel.class.php");//PHPExcel//获取数据 $objP ...
- DevExpress中GridControl控件焦点改变时触发事件
FocusedRowObjectChanged 事件.可以在焦点改变一行的时候触发对应的事件. 做一个记录 大家如果有问题可以 Console.WriteLine("加群"+&qu ...
- updog:一款局域网传输文件的软件
前言 不知道你是否有过这样 的需求,在局域网传输文件,苦于没有好的软件支持,或者只能单向传输,updog可以完全解决这种问题 安装 pip3 install updog updog是python中的一 ...
- 【图像处理笔记】SIFT算法原理与源码分析
[图像处理笔记]总目录 0 引言 特征提取就是从图像中提取显著并且具有可区分性和可匹配性的点结构.常见的点结构一般为图像内容中的角点.交叉点.闭合区域中心点等具有一定物理结构的点,而提取点结构的一般思 ...
- vite安装使用流程
安装vite 使用npm npm create vite@latest 使用yarn yarn create vite 使用pnpm pnpm create vite 还有一些选择配置比如使用那种框架 ...
- 一个有趣的nginx HTTP 400响应问题分析
背景 之前在一次不规范HTTP请求引发的nginx响应400问题分析与解决 中写过客户端query参数未urlencode导致的400问题,当时的结论是: 对于query参数带空格的请求,由于其不符合 ...