C++/C 线性插值

news2024/11/15 13:56:16

插值

插值,是根据已知的数据序列(可以理解为你坐标中一系列离散的点),找到其中的规律,然后根据找到的这个规律,来对其中尚未有数据记录的点

应用

  1. 对缺失的数据进行补偿
  2. 对图像进行放大缩小

通用公式

在这里插入图片描述
如上图,该公式为通用公式。可以看到,该公式为线性变化

常见的传统插值方法有

最邻近插值(0阶线性插值)

解释:取相邻最近的值。实际中可用四舍五入操作
这是最简单的一种插值方法,不需要计算,在待求象素的四邻象素中,将距离待求象素最近邻的像素灰度赋给待求象素。设为待求象素坐标(x+u,y+v) ,【注:x,y为整数, u,v为大于零小于1的小数】则待求象素灰度的值 f(x+u,y+v)为 ,选取距离插入的像素点(x+u, y+v)最近的一个像素点,用它的像素点的灰度值代替插入的像素点。

特点:最近邻插值法虽然计算量较小,但可能会造成插值生成的图像灰度上的不连续,在灰度变化的地方可能出现明显的锯齿状。

线性插值

解释:根据公式计算得出中间值,只有一个未知量。若两边界之差为最小单位时,则与最邻近插值一致
在这里插入图片描述
上图是一个一维线性插值的定量示意图,x0 和 x1 都是原有的坐标点,灰度值分别对应为 y0 和 y1。而灰度值未知的插值点 x,根据线性插值法约束,在 (x0, y0) 和 (x1, y1) 构成的一次函数上,其灰度值 y 即为
在这里插入图片描述

双线性插值

解释:双线性插值常见于二维平面,通过坐标关系,求解xy。核心思想是在两个方向上分别进行一次线性插值.
在这里插入图片描述
上图是一个二维双线性插值的定量俯视示意图 (点位稍有变动但不影响),我们换个顺序。先由像素坐标点 (x0, y0) 和 (x1, y0) 在 x 轴向作一维线性插值得到 f(x, y0)、由像素坐标点 (x0, y1) 和 (x1, y1) 在 x 轴向作一维线性插值得到 f(x, y1):
在这里插入图片描述
在这里插入图片描述
然后再由 (x, y0) 和 (x, y1) 在 y 轴向作一维线性插值得到插值点 (x, y) 的灰度值 f(x, y):
在这里插入图片描述
合并上式,得到最终的双线性插值结果:
在这里插入图片描述
特点:双线性内插法的计算比最邻近点法复杂,计算量较大,但没有灰度不连续的缺点,结果基本令人满意。它具有低通滤波性质,使高频分量受损,图像轮廓可能会有一点模糊。

e.g.

// 二维图像缩放
void imagePixelProcess(BYTE* destData, int destW, int destH, BYTE* srcData, int srcW, int srcH, bool redFull, int* idList, int channel /*= 3*/)
{
	auto funcImageNearestScale = [destData, srcData, destW, srcW, channel](int destX, int destY, double scaleX, double scaleY) -> void
	{
		// NOTE 缩放,公式:destX * rx = srcW, destY * ry = srcH
		int srcX = std::round(scaleX * destX), srcY = std::round(scaleY * destY);
		memcpy(destData + (destY * destW + destX) * channel, srcData + (srcY * srcW + srcX) * channel, sizeof(BYTE) * channel);
	};

	auto funcDrawReconstructionArea = [destData, destW, srcW, idList, channel](int destX, int destY, double scaleX, double scaleY) -> void
	{
		int srcX = std::round(scaleX * destX), srcY = std::round(scaleY * destY);

		int lSrcX = destX < 1 ? 0 : std::ceil(scaleX * destX - scaleX), rSrcX = destX == (destW - 1) ? srcW - 1 : std::floor(scaleX * destX + scaleX);
		for (int i = lSrcX; i <= rSrcX; i++)
		{
			if (idList[srcY * srcW + i] != -1)
			{
				destData[(destY * destW + destX) * channel] = 0;
				destData[(destY * destW + destX) * channel + 1] = 0;
			}
		}
	};

	auto funcRedFullImage = [destData, destW, channel](int destX, int destY) -> void
	{
		auto redPxielIndex = (destY * destW + destX) * channel;
		if (destData[redPxielIndex] == 255 && destData[redPxielIndex + 1] == 255 && destData[redPxielIndex + 2] == 255)
		{
			destData[redPxielIndex + 1] = 0;
			destData[redPxielIndex + 2] = 0;
		}
	};

	double rx = srcW / (double)destW, ry = srcH / (double)destH;

	memcpy(destData, srcData, sizeof(BYTE) * channel);

	for (int destY = 0; destY < destH; destY++)
	{
		for (int destX = 0; destX < destW; destX++)
		{
			funcImageNearestScale(destX, destY, rx, ry);

			if (idList != nullptr)
			{
				funcDrawReconstructionArea(destX, destY, rx, ry);
			}

			if (redFull)
			{
				funcRedFullImage(destX, destY);
			}
		}
	}

	destData += (destW * destH) * channel;
}

双三次插值

略,用到时详解

参考文章

[1] 【图像处理】详解 最近邻插值、线性插值、双线性插值、双三次插值
[2] 常用线性插值的介绍和应用(双线性插值,三线性插值,平滑曲线插值
[3] 常用的三种插值算法

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

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

相关文章

小白跟做江科大32单片机之按键控制LED

原理部分 1.LED部分使用的是这样的连接方式 2.传感器模块的电路图 滤波电容如果接地&#xff0c;一般用于滤波&#xff0c;在分析电路时就不用考虑。下面这个电路就是看A端和B端哪端的拉力大&#xff0c;就能把电压值对应到相应的电压值 比较器部分 如果A端电压>B端电压&am…

【MySQL】表的连接和复合查询

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;MySQL 目录 &#x1f449;&#x1f3fb;连接JOIN&#x1f449;&#x1f3fb;子查询&#x1f449;&#x1f3fb;合并查询 &#x1f449;&#x1f3fb;连接JOI…

【算法】位运算算法——消失的两个数字(困难)

题解&#xff1a;消失的两个数字(位运算算法) 目录 1.题目2.题解3.示例代码如下4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 本题要求时间复杂度O(N),空间复杂度O(1),分别否了我们 排序遍历 和 哈希数组 的想法。想要在规定时间/空间复杂度内完成本题&#xff0c;需要借…

辅导男朋友转算法岗第1天|tokenizer

文章目录 LLM训练流程LLM中的tokenizersBPEWordPieceUnigramSentencePiece&#xff08;使用BBPE或Unigram&#xff09; LLM训练流程 【大语言模型LLM基础之Tokenizer完全介绍-哔哩哔哩】 https://b23.tv/2kdTKxf LLM中的tokenizers 三种不同分词粒度的Tokenizers word-based…

python 获取网页乱码怎么解决

在使用python爬取网页时&#xff0c;经常会遇到乱码问题&#xff0c;一旦遇到乱码问题&#xff0c;就很难得到有用的信息。本人遇到乱码问题&#xff0c;一般有以下几个方式&#xff1a; 1、查看网页源码中的head标签&#xff0c;找到编码方式&#xff0c;例如&#xff1a; 可…

【UML用户指南】-02-UML基本元素的介绍(二)

1、语法和语义规则 命名——为事物、关系和图起的名字&#xff1b; 范围——使名字具有特定含义的语境&#xff1b; 可见性——这些名字如何让其他成分看见和使用&#xff1b; 完整性——事物如何正确、一致地相互联系&#xff1b; 执行——运行或模拟一个动态模型意味着什…

安卓 Flutter Channel 源码解析

Flutter 官方提供三种 Platform 与 Dart 端消息通信方式&#xff0c;他们分别是 MethodChannel 、 BasicMessageChannel 、 EventChannel MethodChanel &#xff1a;用于传递方法调用&#xff0c; MethodCallHandler 最终必须在 UI 线程通过 result. success(x) 方法返回…

【深度学习】YOLOv10实战:20行代码将笔记本摄像头改装成目标检测监控

目录 一、引言 二、YOLOv10视觉目标检测—原理概述 2.1 什么是YOLO 2.2 YOLO的网络结构 三、YOLOv10视觉目标检测—训练推理 3.1 YOLOv10安装 3.1.1 克隆项目 3.1.2 创建conda环境 3.1.3 下载并编译依赖 3.2 YOLOv10模型推理 3.2.1 模型下载 3.2.2 WebUI推理 …

成功解决“ImportError: cannot import name ‘mapping‘ from ‘collections‘”错误的全面指南

成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 成功解决“ImportError: cannot import name ‘mapping’ from ‘collections’”错误的全面指南 一、引言 在Python编程中&#xff0c;当我们尝试从某个模块中导入某个名称时&…

上弦外媒新闻发稿:2024年度国外主流新闻媒体和海外媒体软文分发平台有哪些?

2024年度主流海外媒体新闻发稿和海外媒体软文分发平台有很多&#xff0c;下面是一些常见的和广受认可的平台&#xff1a; 主流新闻媒体 CNN - 美国知名新闻网络&#xff0c;覆盖广泛的国际新闻。BBC - 英国广播公司&#xff0c;提供全球新闻和深入报道。纽约时报 - 美国主流报…

UnityAPI学习之 事件函数(生命周期函数)的整体调用流程及细节

事件函数(生命周期函数)的整体调用流程 Reset() 这个函数会在用户首次添加该组件时或单击 Reset 按钮时被调用&#xff0c;且只在编辑器生效,可用于保存默认值 示例&#xff1a; using System.Collections; using System.Collections.Generic; using UnityEngine;public cla…

Docker中布置Jenkins实现Android项目的自动化构建

因项目需要&#xff0c;要在服务器上使用Jenkins完成Android项目的自动化构建&#xff0c;但服务器上登录的账户没有管理员权限&#xff0c;无法用sudo命令&#xff0c;因此需要把相应环境布置在docker中。 环境搭建 docker容器相关命令 创建容器 docker create -it contai…

Android Handler机制使用及全面解析

前言 我是真的不想写这篇总结&#xff0c;说实话&#xff0c;关于Handler&#xff0c;全面且优秀的文章多的很。 但是这东西吧&#xff0c;还是想以自己的方式再去细看一下它的原理&#xff0c;实现源码&#xff0c;它的各种机制&#xff0c;在App中使用到的地方。 这样或许…

【深度揭秘GPT-4o】:全面解析新一代AI技术的突破与优势

目录 ​编辑 1.版本对比&#xff1a;从GPT-3到GPT-4&#xff0c;再到GPT-4o的飞跃 1.1 模型规模的扩展 1.2 训练数据的更新 1.3 算法优化与效率提升 1.4 案例分析 2.技术能力&#xff1a;GPT-4o的核心优势 2.1 卓越的自然语言理解 2.1.1 上下文理解能力 2.1.2 语义分…

地质灾害位移应急监测站

地质灾害位移应急监测站是一种专门用于地质灾害预警和应急响应的设施&#xff0c;它能够实时监测和分析山体、建筑物、管道等的位移变化情况。以下是关于地质灾害位移应急监测站的详细介绍&#xff1a; 主要组成部分 传感器&#xff1a;安装于需要监测的位置&#xff0c;用于…

chap4 simple neural network

全连接神经网络 问题描述 利用numpy和pytorch搭建全连接神经网络。使用numpy实现此练习需要自己手动求导&#xff0c;而pytorch具有自动求导机制。 我们首先先手动算一下反向传播的过程&#xff0c;使用的模型和初始化权重、偏差和训练用的输入和输出值如下&#xff1a; 我…

鹤城杯 2021 流量分析

看分组也知道考http流量 是布尔盲注 过滤器筛选http流量 将流量包过滤分离 http tshark -r timu.pcapng -Y "http" -T json > 1.json这个时候取 http.request.uri 进一步分离 http.request.uri字段是我们需要的数据 tshark -r timu.pcapng -Y "http&quo…

MFC 模态对话框的实现原理

参考自MFC 模态对话框的实现原理 - 西昆仑 - OSCHINA - 中文开源技术交流社区 1. 模态对话框 在涉及 GUI 程序开发的过程中&#xff0c;常常有模态对话框以及非模态对话框的概念 模态对话框&#xff1a;在模态对话框活动期间&#xff0c;父窗口是无法进行消息响应&#xff0…

The book

Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD is the book that forms the basis for this course. We recommend reading the book as you complete the course. There’s a few ways to read the book – you can buy it as a paper bo…

到无穷大和更远,用分形更好

文章目录 一、说明二、分形到底是什么&#xff1f;三、更多更深刻的四、引进无穷小会产生什么样的怪事&#xff1f;五、希尔伯特曲线六、还有什么有趣的要补充的吗&#xff1f; 一、说明 ​​​​​​​数学领域有太多有趣的领域&#xff0c;领域我特别感兴趣。这是一个奇妙的…