图形学初识--直线插值算法

文章目录

  • 为什么需要插值算法?
  • 插值算法是什么?
  • 有哪些常见的插值算法呢?
    • 1. 线性插值(Linear Interpolation)
    • 2. 多项式插值(Polynomial Interpolation)
    • 3. 样条插值(Spline Interpolation)
    • 4. 最近邻插值(Nearest-Neighbor Interpolation)
    • 5. 双线性插值(Bilinear Interpolation)
    • 6. 双三次插值(Bicubic Interpolation)
    • 7. 克里金插值(Kriging Interpolation)
  • 直线如何线性插值?
    • 1、暴力法
    • 2、优化法
  • 效果展示:
  • 结尾:喜欢的小伙伴可以点点关注+赞哦

为什么需要插值算法?

不说大道理,承接上文直线光栅化。已知屏幕两个点,计算出以这两点为端点的直线经过的所有像素,准确的说是像素点的坐标;但是,像素是有颜色属性的,端点的颜色已知,但是中间点颜色是未知的,这时候为了给这些中间点补充颜色属性,就需要引入插值算法,在这个场景下就叫直线的线性插值!

插值算法是什么?

插值算法是一种通过已知数据点值来估计未知数据点值的方法。基本思想:基于已知数据点构建一个函数,该函数能够通过这些点,并估计这些点之间的值!

有哪些常见的插值算法呢?

1. 线性插值(Linear Interpolation)

线性插值是一种最简单的插值方法,它假设两个相邻点之间的函数变化是线性的。即,对于两个已知数据点 ( x 0 , y 0 ) , ( x 1 , y 1 ) (x_0,y_0),(x_1,y_1) (x0,y0),(x1,y1) ,插值点 ( x , y ) (x,y) (x,y)​ 可以通过以下公式计算:
y = y 0 + ( y 1 − y 0 ) ( x − x 0 ) ( x 1 − x 0 ) y = y_0 + \frac{(y_1-y_0)(x-x_0)}{(x_1-x_0)} y=y0+(x1x0)(y1y0)(xx0)
线性插值简单且计算快速,但它只能在两个已知点之间产生线性估计,可能不适用于变化较复杂的数据。

2. 多项式插值(Polynomial Interpolation)

多项式插值使用一个多项式函数来通过所有已知数据点。拉格朗日插值(Lagrange Interpolation)和牛顿插值(Newton Interpolation)是两种常见的多项式插值方法。对于 𝑛+1个数据点,可以找到一个 𝑛 次多项式通过这些点:
P ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a n x n P(x) = a_0 + a_1x + a_2x^2 + ... + a_nx^n P(x)=a0+a1x+a2x2+...+anxn
多项式插值可以提供更精确的估计,但当点数较多时,高次多项式可能出现震荡现象(龙格现象)。

3. 样条插值(Spline Interpolation)

样条插值使用低次多项式段(通常是三次样条)连接所有数据点,同时确保在每个数据点处多项式的连续性和光滑性。三次样条插值常用于曲线拟合和图形处理。

4. 最近邻插值(Nearest-Neighbor Interpolation)

最近邻插值使用距离目标点最近的已知点的值作为估计值。这种方法简单且计算快速,但可能会导致不连续和不平滑的结果。

5. 双线性插值(Bilinear Interpolation)

双线性插值用于二维数据网格,它在每个方向上进行线性插值。对于四个相邻点,插值点的值通过对两个方向的线性插值计算得出。它常用于图像处理中的像素值插值。

6. 双三次插值(Bicubic Interpolation)

双三次插值使用三次多项式进行插值,比双线性插值能产生更平滑的结果。它通常用于高质量图像缩放。

7. 克里金插值(Kriging Interpolation)

克里金插值是一种地统计学方法,基于已知点的统计性质进行插值。它考虑了空间自相关性,常用于地理信息系统(GIS)和环境科学。

直线如何线性插值?

问题描述:已知直线起始端点 p 0 = ( x 0 , y 0 ) p_0 = (x_0, y_0) p0=(x0,y0) p 1 = ( x 1 , y 1 ) p_1 = (x_1, y_1) p1=(x1,y1) f ( p 0 ) = v 0 f(p_0) = v_0 f(p0)=v0 f ( p 1 ) = v 1 f(p_1) = v_1 f(p1)=v1,求直线上任意一点 p = ( x , y ) p=(x,y) p=(x,y) f ( p ) = ? f(p) = ? f(p)=?

1、暴力法

算法步骤描述:

  • 计算 p 0 p_0 p0 p 1 p_1 p1 的距离,记为 d d d

  • 计算 p p p p 0 p_0 p0 p 1 p_1 p1 的距离,分别记为 d 0 d_0 d0 d 1 d_1 d1

  • 计算权值 w e i g h t = d 0 / d weight = d_0 / d weight=d0/d

  • 计算 p p p点的属性值 f ( p ) = w e i g h t ∗ f ( p 1 ) + ( 1 − w e i g h t ) ∗ f ( p 0 ) f(p) = weight * f(p_1) + (1 - weight) * f(p_0) f(p)=weightf(p1)+(1weight)f(p0)

如图所示:

在这里插入图片描述

2、优化法

本质思路:计算点和点的距离是比较耗时的,咱们可以用初中数学知识,相似三角形从而简化问题的计算,提高性能!

算法步骤描述:

  • 计算 d x = x 1 − x 0 d_x = x_1 - x_0 dx=x1x0 d y = y 1 − y 0 d_y = y_1 - y_0 dy=y1y0 ,咱们假设 d x ! = 0 d_x != 0 dx!=0 其实y方向也是类似同理

  • 计算 d p = x − x 0 d_p = x - x_0 dp=xx0

  • 计算权值 w e i g h t = d p / d x weight = d_p / d_x weight=dp/dx

  • 计算 p p p点的属性值 f ( p ) = w e i g h t ∗ f ( p 1 ) + ( 1 − w e i g h t ) ∗ f ( p 0 ) f(p) = weight * f(p_1) + (1 - weight) * f(p_0) f(p)=weightf(p1)+(1weight)f(p0)

如图所示:

在这里插入图片描述

效果展示:

咱们用一个从红色到绿色的直线,上效果图:

在这里插入图片描述

结尾:喜欢的小伙伴可以点点关注+赞哦

希望对各位小伙伴能够有所帮助哦,永远在学习的道路上伴你而行, 我是航火火,火一般的男人!

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

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

相关文章

Blazor 下支持 Azure AD 的多套登录方案

比如上图配置了两套不同的登录方案,各有自己的 TenantId 和 ClientId ,要同时支持他们的登录(其实在同一套 TenantId 和 ClientId 里面配置多个登录账户不就好了,但是......那套登录的管理是在客户自己的Azure AD账户管理下的&…

SpringBoot3 解决NoResourceFoundException: No static resource favicon.ico.异常

SpringBoot3 解决NoResourceFoundException: No static resource favicon.ico.异常 spring boot3项目中浏览器中访问报错找不到favicon.ico,虽然不影响使用,用api工具也可以忽略这个异常,但是防止浏览器访问时出现异常干扰日志,所…

oracle数据库解析过高分析

解析非常高,通过时间模型可以看到解析占比非常高 解析大致可以分为硬解析( hard parse)、软解析( soft parse)和软软解析( soft soft parse)。如,执行一条 SQL 的时候,如…

星型模型和雪花模型的区别

星型模型和雪花模型都是数据仓库设计中常用的维度建模方法,它们之间的主要区别在于数据组织结构、数据冗余度、查询效率、可扩展性和正规化程度等方面: 星型模型 结构特点:星型模型中,一个中心的事实表连接多个维度表&#xff0…

在电脑中,Apple Mobile Device Support程序是什么?

Apple Mobile Device Support 是一项关键的后台服务,它为 Windows 用户提供了与苹果 iOS 设备(包括 iPhone、iPad 和 iPod)顺畅互动的能力。这项服务的核心功能是为iTunes软件提供必要的支持,使得用户能够将他们的移动设备与电脑连…

Google Find My Device:科技守护,安心无忧

在数字化的时代,我们的生活与各种智能设备紧密相连。而 Google Find My Device 便是一款为我们提供安心保障的实用工具。 一、Find My Decice Netword的定义 谷歌的Find My Device Netword旨在通过利用Android设备的众包网络的力量,帮助用户安全的定位所…

HTML5 历史、地理位置处理、全屏处理

目录 历史HistoryAPI地理位置处理GeolocationAPI全屏处理FullscreenAPIHistoryAPI window.history 对象 window.history 是浏览器提供的一个内置对象,它提供了对浏览器历史记录的访问和操作能力。通过这个对象,开发者可以实现无刷新页面跳转、添加新的浏览历史条目等,从而提…

STM32F4_HAL控制GPIO输出——跑马灯实验

1、GPIO工作模式 1.1 端口输入数据寄存器(IDR) 1.2 端口输出数据寄存器(ODR) 1.3 端口置位/复位寄存器(BSRR) 为什么有了 ODR 寄存器,还要这个 BSRR 寄存器呢?我们先看看 BSRR 的寄…

23种设计模式(持续输出中)

一.设计模式的作用 设计模式是软件从业人员长期总结出来用于解决特定问题的通用性框架,它提高了代码的可维护性、可扩展性、可读性以及复用性。 二.设计模式 1.工厂模式 工厂模式提供了创建对象的接口,而无需制定创建对象的具体类,工厂类…

hive表在HDFS的每个文件的大小加大

配置参数: spark.hadoop.hive.exec.orc.default.stripe.size78643200 spark.hadoop.orc.stripe.size78643200 spark.hadoopRDD.targetBytesInPartition78643200 spark.hadoop.hive.exec.dynamic.partition.modenonstrict spark.sql.sources.partitionOverwriteMode…

华为OD机试 - 剩余银饰的重量(Java 2024 C卷 100分)

华为OD机试 2024C卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷C卷)》。 刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试…

【Python】 如何对对象列表进行排序,有点意思

在Python中,我们经常需要对对象列表进行排序,这可以通过多种方式实现。当对象是一个自定义类实例时,排序通常基于对象的一个或多个属性。Python提供了内置的sorted()函数和列表的sort()方法,它们都允许我们指定一个排序的关键字。…

iPhone彻底删除的照片怎么恢复?专业技巧助您解忧

在使用iPhone的过程中,我们可能会因为误操作或其他原因将一些重要的照片彻底删除。然而,即使照片被彻底删除,也并不意味着它们就永远消失了,它们只是被打上了“可覆盖的空间”的标签。 在照片被新数据覆盖之前,我们仍…

C语言学习【C控制语句:循环】

C语言学习【C控制语句:循环】 while循环 /* 根据用户键入的整数求和 */#include "stdio.h"int main(void) {long num;long sum 0L; /* 把sum初始化为0 */int status;printf("Please enter an integer to be summed");printf(&quo…

基于微信小程序的校园捐赠系统的设计与实现

校园捐赠系统是一种便捷的平台,为校园内的各种慈善活动提供支持和便利。通过该系统,学生、教职员工和校友可以方便地进行捐赠,并了解到相关的项目信息和捐助情况。本文将介绍一个基于Java后端和MySQL数据库的校园捐赠系统的设计与实现。 技术…

Java日期Date和LocalDateTime的工具类

Date package com.qiangesoft.utils.date;import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date;/*** 日期工具类** author lq* date 2024-05-23*/ public class DateUtil {public static final String[] CHINESE_WEEK_DAY new String[]{&q…

Excel 公式积累

1.获取当前位置的左侧单元格 引用当前单元格左侧的第一个单元格:OFFSET(INDIRECT(ADDRESS(ROW(), COLUMN())),0,-1) ROW()返回当前单元格的行号,COLUMN()返回当前单元格的列号。 ADDRESS函数可以根据指定行号和列号获得工作表中的某个单元格的地址。例如…

go全部版本下载目录

linux安装教程: Download and install - The Go Programming Language rm -rf /usr/local/go && tar -C /usr/local -xzf go1.22.3.linux-amd64.tar.gzexport PATH$PATH:/usr/local/go/bin go version 全部版本下载目录: All releases - Th…

鸿蒙本机通信

demo地址 https://github.com/MartinLi89/WanHarmony 目前只学到一部分,不正确的地方,还望大家指正,我会及时更新,谢谢,欢迎评论留言 线程内通信,线程间通信,进程间通信 本篇帖子中描述的比较宽…

快速开发 Chrome插件

什么是 Chrome 插件 Chrome 插件程序是一种用于增强 Google Chrome 浏览器功能的小型软件应用程序。它们可以帮助用户自定义浏览体验、添加新功能、集成外部服务以及自动化任务等。扩展程序使用 HTML、CSS 和 JavaScript 编写,利用 Chrome 提供的 API 来与浏览器及…