深度学习之双线性插值

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.mzph.cn/news/22776.shtml

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

相关文章

小白也能懂!业务中台与数据中台究竟是什么?

大家好,今天我们要讨论的是业务中台与数据中台,或许你对这些名词还不太熟悉,但别担心,接下来我将为你详细解释这两个概念,并且用通俗易懂的语言来解释它们。 业务中台是什么? 首先,让我们来了解…

ubuntu搭建wifi热点,共享网络(x86、arm相同)

目录 1 首先检查网络管理器服务是否开启 (ubuntu需要界面) 2 创建并配置需要共享的wifi 首先,明确下这篇文章说的是啥,是为了在ubuntu系统的电脑上,搭建一个wifi热点,供其他移动设备连接上网。就像你…

java实现钉钉群机器人@机器人获取信息后,机器人回复(机器人接收消息)

1.需求 鉴于需要使用钉钉群机器人回复,人们提出的问题,需要识别提出的问题中的关键词,后端进行处理实现对应的业务逻辑 2.实现方式 用户群机器人,附带提出的问题,后端接收消息后识别消息内容,读取到关键…

第3章 数据和C

本章介绍以下内容: 关键字:int 、short、long、unsigned、char、float、double、_Bool、_Complex、_Imaginary 运算符:sizeof() 函数:scanf() 整数类型和浮点数类型的区别 如何书写整型和浮点型常数,如何声明这些类型的…

Vue-系统登录进入首页后禁用浏览器返回键

解决方法 mounted() {history.pushState(null, null, document.URL)window.addEventListener(popstate, this.goBack, false) }, destroyed() {// 清除popstate事件 否则会影响到其他页面window.removeEventListener(popstate, this.goBack, false) }, methods: {goBack() {hi…

ImagXpress .NET Standard Crack

ImagXpress .NET Standard Crack ImagXpress SDK可让您快速将图像功能添加到Windows应用程序中。您可以快速开发需要复杂成像任务的应用程序,用于文档成像、照片处理或医疗应用程序,同时专注于您的程序的独特需求。ImagXpress是开发涉及图像的专业应用程…

Windows下JDK安装与环境变量配置

文章目录 每日一句正能量前言安装步骤配置环境变量验证环境变量是否配置成功后记 每日一句正能量 生命,就像一场永无休止的苦役,不要惧怕和拒绝困苦,超越困苦,就是生活的强者。任何经历都是一种累积,累积的越多,人就越成熟;经历的越多,生命就越有厚度。 本来不想写JDK的安装的&…

SAP 动态编程-动态获取结构字段对象(类模式)

实施方法 GET_DYNAMIC_FIELD_OBJECT 参数 代码 DATA: lt_source TYPE TABLE OF string.DATA: lv_name TYPE sy-repid VALUE ZTEMP_GET_DYNAMIC_OBJECT,lv_form(30) TYPE c VALUE FRM_GENERATE_OBJECT,lv_message(240) TYPE c,lv_line TYPE i,lv_word(72…

Spring源码:Spring创建容器总结

Spring创建容器总结 创建Spring容器对象Spring加载spring.properties配置文件Spring是否支持spelSpring设置需要加载的配置文件路径Spring解析占位符Spring创建标准环境StandardEnvironmentSpring创建占位符解析器Spring创建占位符助手 使用ClassPathXmlApplicationContext创建…

pip升级超时问题

今天升级pip超时提示 :failed with error code 1 in None,问题原因是pip版本过低,需要升级pip。 升级pip命令(绝逼不会超时了) python -m pip install --upgrade pip -i http://pypi.douban.com/simple --trusted-ho…

通过Idea部署Tomcat服务器(详细图文教学)

1.在idea中创建项目 有maven构建工具就创建maven,没有就正常创建一个普通的java程序 创建普通java项目 2.添加框架 3.配置 Tomcat 注意:创建web项目后我们需要配置tomcat才能运行,下面我们来进行配置。 4.添加部署 回到服务器 5.完善配置 6…

第28天-Kubernetes架构,集群部署,Ingress,项目部署,Dashboard

1.K8S集群部署 1.1.k8s快速入门 1.1.1.简介 Kubernetes简称k8s,是用于自动部署,扩展和管理容器化应用程序的开源系统。 中文官网:https://kubernetes.io/zh/中文社区:https://www.kubernetes.org.cn/官方文档:https…

Flask 是什么?Flask框架详解及实践指南

Flask 是一个轻量级的 Python Web 框架,它被广泛用于构建 Web 应用程序和 API。Flask 简单易用,具有灵活性和可扩展性,是许多开发者喜欢用其构建项目的原因。本文将介绍 Flask 是什么以及如何使用它来构建 Web 应用程序,同时提供一…

redis原理 3:未雨绸缪 —— 持久化

redis原理 3:未雨绸缪 —— 持久化 Redis 的数据全部在内存里,如果突然宕机,数据就会全部丢失,因此必须有一种机制来保证 Redis 的数据不会因为故障而丢失,这种机制就是 Redis 的持久化机制。 Redis 的持久化机制有两种…

docker容器内的django启动celery任务队列

问题1: celery任务队列一般要使用redis,但是容器内的django要访问本机的redis是十分麻烦的 解决2: 在容器内安装redis,或者单独启动一个redis的容器,我是单独启动一个redis容器 安装redis镜像docker pull redis启动…

【Ansible】Ansible自动化运维工具之playbook剧本搭建LNMP架构

LNMP 一、playbooks 分布式部署 LNMP1. 环境配置2. 安装 ansble3. 安装 nginx3.1 准备 nginx 相关文件3.2 编写 lnmp.yaml 的 nginx 部分3.3 测试 nginx4. 安装 mysql4.1 准备 mysql 相关文件4.2 编写 lnmp.yaml 的 mysql 部分4.3 测试 mysql5. 安装 php5.1 编写 lnmp.yaml 的 …

gradio创建机器学习的好工具 基本使用和示例

1.gradio介绍 Gradio: 用Python构建机器学习网页APP Gradio是一个开源的Python库,用于构建演示机器学习或数据科学,以及web应用程序。 使用Gradio,您可以基于您的机器学习模型或数据科学工作流快速创建一个漂亮的用户界面,让用户可以”尝试“拖放他们自己的图像、粘贴文本…

【云原生持续交付和自动化测试】5.2 自动化测试和集成测试

往期回顾: 第一章:【云原生概念和技术】 第二章:【容器化应用程序设计和开发】 第三章:【基于容器的部署、管理和扩展】 第四章:【微服务架构设计和实现】 第五章:【5.1 自动化构建和打包容器镜像】 5…

【深度学习_TensorFlow】感知机、全连接层、神经网络

写在前面 感知机、全连接层、神经网络是什么意思? 感知机: 是最简单的神经网络结构,可以对线性可分的数据进行分类。 全连接层: 是神经网络中的一种层结构,每个神经元与上一层的所有神经元相连接,实现全连接。 神经…