深度学习之双线性插值

1、单线性插值

单线性插值是一种用于估计两个已知数据点之间未知点的方法。它基于线性关系,通过计算目标位置的值,使用已知点之间的线性函数进行插值。这在图像处理中常用于放缩、旋转等操作,计算简单,产生平滑结果,但在放大时可能造成轻微模糊。

目前已经知道了(x_{1},y_{1})(x_{2},y_{2})之间的斜率,在[x_{1},x_{2}]这个区间内,我们要求某x对应的y值很容易,因为它是线性的,那么通过x_{0}x两点的斜率,以及x_{0}x_{1}之间的斜率,即可假设出直线方程。

\frac{y-y_{0}}{x-x_{0}}=\frac{y_{1}-y_{0}}{x_{1}-x_{0}}

y=\frac{x_{1}-x}{x_{1}-x_{0}}y_{0}+\frac{x-x_{0}}{x_{1}-x_{0}}y_{1}

通过计算就能算出x点对应的函数值y了

2、双线性插值

双线性插值是一种用于估计两个已知数据点之间未知点的方法。它考虑了目标位置在两个方向上的线性关系,通过对四个最近的已知点进行加权平均,进行插值计算。这在图像处理中常用于平滑放缩、旋转等操作,比最近邻法更精确,产生更平滑的结果。

如图所示,我们需要求P点的像素值。我们已知了Q11、Q21、Q12、Q22、P的坐标。也知道Q11、Q21、Q12、Q22的像素值。所以先用关于X的单线性插值去分别计算R1R2的像素值。

f(x,y_{1})\approx \frac{x_{2}-x}{x_{2}-x_{1}}f(Q_{11})+\frac{x-x_{1}}{x_{2}-x_{1}}f(Q_{21})

f(x,y_{2})\approx \frac{x_{2}-x}{x_{2}-x_{1}}f(Q_{12})+\frac{x-x_{1}}{x_{2}-x_{1}}f(Q_{22})

在右边的等式中的字母f(Q11)、f(Q12)、f(Q21)、f(Q22)、x1、x2、x都是已知的,求出的f(x,y1)与f(x,y2)即为R1、R2的像素值。

再使用关于y方向的单线性插值计算P点的像素值

得出:

f(x,y)\approx \frac{y_{2}-y}{y_{2}-x_{1}}f(x,y_{1})+\frac{y-y_{1}}{y_{2}-y_{1}}f(x,y_{2})

在右边的等式中的字母y1、y2、y都是已知的,f(x,y_{1})f(x,y_{2})即为上一个式子中求出的R1、R2像素值。

3、手写代码实现

代码显示参考的这位博主的。双线性插值法(Bilinear Interpolation)_绯雨千叶的博客-CSDN博客

但它使用的是显示循环,对于计算量较高,这里我对代码进行了改进,采用了网格坐标、数组广播和矩阵运算等技巧,使得插值过程更加高效。 

import cv2
import numpy as np
import pyzjr as pz# 已添加进pyzjr中
def bilinear_interpolation(image, scale):ah, aw, channel = image.shapebh, bw = int(ah * scale), int(aw * scale)dst_img = np.zeros((bh, bw, channel), np.uint8)y_coords, x_coords = np.meshgrid(np.arange(bh), np.arange(bw), indexing='ij')AX = (x_coords + 0.5) / scale - 0.5   # 移向像素中心AY = (y_coords + 0.5) / scale - 0.5x1 = np.floor(AX).astype(int)y1 = np.floor(AY).astype(int)x2 = np.minimum(x1 + 1, aw - 1)y2 = np.minimum(y1 + 1, ah - 1)R1 = ((x2 - AX)[:, :, np.newaxis] * image[y1, x1]).astype(float) + ((AX - x1)[:, :, np.newaxis] * image[y1, x2]).astype(float)R2 = ((x2 - AX)[:, :, np.newaxis] * image[y2, x1]).astype(float) + ((AX - x1)[:, :, np.newaxis] * image[y2, x2]).astype(float)dst_img = (y2 - AY)[:, :, np.newaxis] * R1 + (AY - y1)[:, :, np.newaxis] * R2return dst_img.astype(np.uint8)image=cv2.imread(r"./data\campuscrack\00231.jpg")
dst_img=bilinear_interpolation(image,1.5)
cv2.imshow("name2",image)
cv2.imshow("name",dst_img)
cv2.waitKey(0)

scale=1.5的效果: 

4、实验分析

     双线性插值在图像处理中的意义是通过在两个方向上的插值,更准确地估计新像素的值,以改善图像的质量、平滑边缘,并保持细节,从而实现图像放大、缩小、旋转等操作的高质量效果。

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

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

相关文章

将python源代码打包成.exe可执行文件

步骤 1、安装pyinstaller2、打开终端或命令提示符窗口并进入解释器的虚拟环境3、从解释器的虚拟环境进入包含要打包Python文件的目录4、通过以下命令打包5、打包后文件存放位置 1、安装pyinstaller pip install pyinstaller2、打开终端或命令提示符窗口并进入解释器的虚拟环境…

Win11大小写切换图标关闭方法

大家使用Win11操作系统的时候经常会切换大小写键盘,有些游戏本在游戏过程中需要切换大小写,这个时候电脑的屏幕就会出现大小写切换的图标而影响游戏体验; 那么想要关闭Win11电脑上大小写切换图标,又不知道具体怎么操作&#xff0c…

vscode如何退出/切换 github 账号

退出/切换 github 账号 左下角点击头像按钮,选择注销,然后再重新登录

阿里为啥禁止三表Join关联?

阿里出过一个《Java开发手册》,上面有一条规约是禁止超过三张表的join。 为什么要禁止,其实最主要的原因就是join的效率比较低。 mysql只有一种表连接类型:嵌套循环连接(nested-loop),不支持排序-合并连接(sort-merge join)与散列连接(hash …

纯JS+Vue实现一个仪表盘

在使用canvas的时候发现数值变化&#xff0c;每次都要重新渲染&#xff0c;值都从0开始&#xff0c;这和我的需求冲突。 1. 先绘制基本的圆环背景&#xff0c;利用border-color和border-radius将正方形变成基本的圆环。 <div class"circle"><div class&qu…

Docker实战-操作Docker容器实战(二)

导语   上篇分享中,我们介绍了关于如何创建容器、如何启动容器、如何停止容器。这篇我们来分享一下如何操作容器。 如何进入容器 可以通过使用-d参数启动容器后会进入后台运行,用户无法查看容器中的信息,无法对容器中的信息进行操作。 这个时候如果我们需要进入容器对容器…

利用XSS在线平台获取用户cookie

//XSS弹窗&#xff1a; <script>alert("xss")</script> XSS漏洞&#xff1a; //XSS弹窗&#xff1a; <script>alert("xss")</script> //XSS在线平台&#xff1a; <ScRipT sRc//7ix7kigpovxdbtd32fuspgffmtmufo3wwzgnzaltddewtb…

iMX6ULL应用移植 | 移植 infoNES 模拟器(重玩经典NES游戏)

没玩过NES游戏的童年&#xff0c;可能不是80后的童年。我们小时候是从玩FC开始接触游戏机的&#xff0c;那时真的是红极一时啊&#xff0c;我上初中时还省吃俭用买了一台小霸王&#xff0c;暑假里把电视机都给打爆了&#xff01;那时任天堂单是FC机的主机的发售收入就超过全美的…

程序环境和预处理(含C语言程序的编译+链接)--1

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f43b;‍❄个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN…

在CentOS 7上挂载硬盘到系统的步骤及操作

目录 1&#xff1a;查询未挂载硬盘2&#xff1a;创建挂载目录3&#xff1a;检查磁盘是否被分区4&#xff1a;格式化硬盘5&#xff1a;挂载目录6&#xff1a;检查挂载状态7&#xff1a;设置开机自动挂载总结&#xff1a; 本文介绍了在CentOS 7上挂载硬盘到系统的详细步骤。通过确…

完全背包问题

题目链接 题意&#xff1a;在01背包的基础上多了每个物品都可以无限取的条件 思路&#xff1a;首先考虑在01背包的基础上的暴力枚举&#xff0c;我们可以在枚举前i件物品最多拿j的容量时再遍历当前物品拿的数量 贴一个暴力tle代码&#xff1a; #include<bits/stdc.h> #d…

【云原生K8s】初识Kubernetes的理论基础

K8S由google的Borg系统(博格系统&#xff0c;google内部使用的大规模容器编排工具)作为原型&#xff0c;后经GO语言延用Borg的思路重写并捐献给CNCF基金会开源。 云原生基金会&#xff08;CNCF&#xff09;于2015年12月成立&#xff0c;隶属于Linux基金会。CNCF孵化的第一个项目…

短视频矩阵源码

一、短视频矩阵源码搭建解析&#xff1a; 目录 一、短视频矩阵源码搭建解析&#xff1a; 二、短视频矩阵源码的开发路径分享&#xff1a; 三、短视频矩阵系统开发应具备哪些能力&#xff1f; 短视频技术开发能力&#xff1a; 开发人员应具备短视频相关技术能力&#xff0c…

iOS 后台运行

iOS后台行&#xff0c;一般有两种方式&#xff1a; 1.UIBackgroundTaskIdentifier后台任务标记时, 2.设置后台运行模式&#xff0c;需要有voip&#xff0c;location功能的才行。不然app上线审核肯定是过不了的。 下面是我学习后台运行的尝试过程。 一.首先创建一个项目功程…

python#django数据库一对一/一对多/多对多

一对一OneToOneField 用户和用户信息 搭建 # 一对一 class TestUser(models.Model): usernamemodels.CharField(max_length32) password models.CharField(max_length32) class TestInfo(models.Model): mick_namemodels.CharField(max_length32) usermode…

zookeeper --- 高级篇

一、zookeeper 事件监听机制 1.1、watcher概念 zookeeper提供了数据的发布/订阅功能&#xff0c;多个订阅者可同时监听某一特定主题对象&#xff0c;当该主题对象的自身状态发生变化时(例如节点内容改变、节点下的子节点列表改变等)&#xff0c;会实时、主动通知所有订阅者 …

STM32CubeMX+VSCODE+EIDE+RT-THREAD 工程创建

Eide环境搭建暂且不表&#xff0c;后续补充。主要记录下Vscode环境下 创建Rt-thread工程的过程。分别介绍STM32CubeMX添加rtt支持包的方式和手动添加rtt kernel方式。STM32CubeMX生成工程的时候有"坑"&#xff0c;防止下次忘记&#xff0c;方便渡一下有缘人&#xff…

【Linux后端服务器开发】Reactor模式实现网络计算器

目录 一、Reactor模式概述 二、日志模块&#xff1a;Log.hpp 三、TCP连接模块&#xff1a;Sock.hpp 四、非阻塞通信模块&#xff1a;Util.hpp 五、多路复用I/O模块&#xff1a;Epoller.hpp 六、协议定制模块&#xff1a;Protocol.hpp 七、服务器模块&#xff1a;Server.…

基于SpringBoot+Vue的地方美食分享网站设计与实现(源码+LW+部署文档等)

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

Docker实战-操作Docker容器实战(一)

导语   在之前的分享中&#xff0c;我们介绍了关于如何去操作Docker镜像&#xff0c;下面我们来看看如何去操作容器。 简单来讲&#xff0c;容器是镜像运行的一个实例&#xff0c;与镜像不同的是镜像只能作为一个静态文件进行读取&#xff0c;而容器是可以在运行时进行写入操…