C++| 一维线性插值、imadjust函数

前言:最近要从Matlab代码改C++代码,不能直接用Matlab生成的C代码,因为需要嵌入到已有项目中。Matlab本身有很多很方便的数学公式,但是在C++里没有相关的库的话,需要自己实现。

一维线性插值、imadjust函数

  • 一维线性插值
    • 原理
    • C++代码
  • imadjust函数图像灰度调整
    • 原理
    • C++代码
  • 思路:Matlab代码转C++

一维线性插值

原理

Matlab中的interp1函数插值类型有很多:

  • nearest(最邻近插值法)
  • linear(线性插值)
  • spline(三次样条插值)
  • cubic(三次立方插值)
  • pchip(三次Hermite插值)

本文编写的是linear线性插值,其实是分段线性插值,分段线性插值就是线性插值的原理。

在这里插入图片描述

从分段线性插值图像结果来看,其实就是分别对相邻两个点进行线性插值。新的x点如果落在了相邻两个点之间就用对应的线性插值计算,但是如果新的x点落在了最大和最小以外,这个可以用离得最近的两个相邻点作为线性插值的斜率计算。

C++代码

x和y是分段插值的点坐标,然后new_x是需要插值获得x坐标,new_y是插值对应的y坐标。

double* linear(double* x, double* y, int n, double* new_x, int new_n) {double* new_y;new_y = new double[new_n];double last_x = 0, last_y = 0, next_x = 0, next_y = 0;int p = 0;for (int i = 0; i < new_n; i++) {while (p < n&& new_x[i] < x[p]) {p++;if (p == n)break;}// 考虑落在最小和最大范围外的点,做特殊处理,取最近相邻的点作为线性插值的计算if (p == 0) {last_x = x[0];last_y = y[0];next_x = x[1];next_y = y[1];}else if (p == n) {last_x = x[n-2];last_y = y[n-2];next_x = x[n-1];next_y = y[n-1];}else {last_x = x[p-1];last_y = y[p-1];next_x = x[p];next_y = y[p];}new_y[i] = (new_x[i]-last_x)*((next_y - last_y) / (next_x - last_x))+last_x;}return new_y;
}

imadjust函数图像灰度调整

原理

Matlab中的imadjust函数可以对图像进行灰度调整,调用格式如下:

J=imadjust( I,[low_in;high_in],[low_out;high_out],gamma);

该函数的功能,输入图像数据I:

  • 灰度小于low_in:low_out。
  • 灰度大于low_in且小于high_in:灰度线性变换后,进行gamma变换。
  • 灰度大于high_in:high_out。

结合图像来理解更为直观:
在这里插入图片描述
其中gamma变换,是一个固定的公式 s = c r γ s=cr^γ s=crγ,在gamma为1的时候是线性变换,函数图像如下图:
在这里插入图片描述

C++代码

void imadjust2(unsigned char**Image,int rows,int cols, int low_in, int high_in, int low_out, int high_out, double gamma) {// gamma变换公式unsigned char gammaLut[256];double c = 1.0;for (int i = 0; i < 256; i++)gammaLut[i] = (unsigned char)(c * pow((double)i / 255.0, gamma) * 255.0);// 灰度调整double k = ((double)high_out - low_out) / (high_in - low_in);double result = 0.0;for (int i = 0; i < rows;i++) {for (int j = 0; j < cols;j++) {if (Image[i][j] <= low_in) {Image[i][j] = low_out % 255;}else if (Image[i][j] >= high_in) {Image[i][j] = high_out % 255;}else {result = k * ((double)Image[i][j] - low_in) + low_in;Image[i][j] = gammaLut[(unsigned char)result]%255;}}}
}

思路:Matlab代码转C++

  1. 搜C++有没有现成的库,例如Matlab中傅里叶变换,在C++中就有fftw3.h(CPU)或者cufft.h(GPU)能够实现。
  2. 上网搜有没有别人已经写好的相同功能的,直接搬砖改写。
  3. 在Matlab中右键函数“打开xxx函数”,就会出现该函数使用帮助、原理和源码(有些有 有些没有),这些辅助转写C++代码。

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

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

相关文章

【数据分析基础】实验一 Python运算符、内置函数、序列基本用法

一、实验目的 熟练运用Python运算符。熟练运用Python内置函数。掌握Python的基本输入输出方法。了解lambda表达式作为函数参数的用法。掌握列表、元组、字典、集合的概念和基本用法。了解Python函数式编程模式。 二、实验内容&#xff1a; 1. 在命令模式测试如下命令&#x…

FENDI CLUB精酿啤酒品鉴体验

当提及“品质卓越&#xff0c;口感非凡”的啤酒时&#xff0c;FENDI CLUB精酿啤酒无疑是一个值得一试的选择。这款啤酒以其独特的酿造工艺和优质的原料&#xff0c;为消费者带来了与众不同的味觉享受。 一、独特的酿造工艺 FENDI CLUB精酿啤酒在酿造过程中&#xff0c;严格遵循…

1200度高温预精轧高线测径仪的特点和抗干扰

关键字:高温测径仪,常温测径仪,预精轧测径仪, 高线测径仪, 线材测径设备,抗干扰测径仪, 高线参数&#xff1a;轧材规格&#xff1a;Φ8&#xff5e;36mm轧制速度&#xff1a;≤ 120 m/s轧制温度&#xff1a; ≤1200℃ 高温预精轧高线光电测径仪是一种用于测量高温线材直径的设备…

【数据分析基础】实验numpy、pandas和matplolib

文件score.xlsx 中存放了学生的各个科目的考试成绩&#xff08;如下图&#xff09;&#xff0c; 1. 编程实现&#xff1a;输入任意一个学号&#xff0c;将该学号对应的成绩&#xff0c;通过雷达图显示。 &#xff08;1&#xff09;程序代码&#xff1a; import pandas as pd…

数字科技如何助力博物馆设计,强化文物故事表现力?

国际博物馆日是每年为了推广博物馆和文化遗产&#xff0c;而设立的一个特殊的日子&#xff0c;让我们可以深入探讨博物馆如何更好地呈现和保护我们的文化遗产&#xff0c;随着近年来的数字科技发展&#xff0c;其在博物馆领域的应用越来越广泛&#xff0c;它为博物馆提供了新的…

HTTP协议分析实验:通过一次下载任务抓包分析

HTTP协议分析 问&#xff1a;HTTP是干啥用的&#xff1f; 最简单通俗的解释&#xff1a;HTTP 是客户端浏览器或其他程序与Web服务器之间的应用层通信协议。 在Internet上的Web服务器上存放的都是超文本信息&#xff0c;客户机需要通过HTTP协议传输所要访问的超文本信息。 一、…

Matching Anything by Segmenting Anything

摘要 在复杂场景中跨视频帧稳健地关联相同对象是许多应用的关键&#xff0c;特别是多目标跟踪&#xff08;MOT&#xff09;。当前方法主要依赖于标注的特定领域视频数据集&#xff0c;这限制了学习到的相似度嵌入的跨域泛化能力。我们提出了MASA&#xff0c;一种新颖的方法用于…

【C语言】07.函数

一、概念 C语言的函数&#xff0c;有些翻译为&#xff1a;子程序&#xff0c;子程序这种翻译更加准确⼀些。 C语言中的函数就是⼀个完成某项特定的任务的⼀小段代码。这段代码是有特殊的写法和调用方法的。 C语言的程序其实是由无数个小的函数组合而成的&#xff0c;也可以说&…

湘财证券:核心系统数据库迁移实践分享

6月5日&#xff0c;在某信息技术应用创新产业峰会上&#xff0c;湘财证券发表了题为“核心系统数据库迁移实践分享”的主题演讲&#xff0c;探讨了湘财证券核心系统在金仓数据库的支撑下&#xff0c;完成国产化升级的策略和创新成果&#xff0c;受到国资、金融、医疗、教育、交…

【开源】医院电子病历管理系统 SSM+JSP+MySQL

目录 一、项目介绍 科室模块 医生模块 预约挂号模块 就诊记录模块 就诊评价模块 二、项目界面 三、核心代码 一、项目介绍 经典老框架SSM打造入门项目《医院电子病历管理系统》&#xff0c;分为用户网页和管理后台&#xff0c;包括科室模块、医生模块、预约挂号模块、…

[MQTT]服务器EMQX搭建SSL/TLS连接过程(wss://)

&#x1f449;原文阅读 &#x1f4a1;章前提示 本文采用8084端口进行连接&#xff0c;是EMQX 默认提供了四个常用的监听器之一&#xff0c;如果需要添加其他类型的监听器&#xff0c;可参考官方文档&#x1f517;管理 | EMQX 文档。 本文使用自签名CA&#xff0c;需要提前在L…

【Redis】构建强韧的远程Redis连接与端口保障机制完美指南

【Redis】构建强韧的远程Redis连接与端口保障机制完美指南 大家好 我是寸铁&#x1f44a; 总结了【Redis】构建强韧的远程Redis连接与端口保障机制完美指南✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 在当今的软件开发领域中&#xff0c;远程访问和操作数据存储是极为常见…

STM32项目分享:智能家居安防系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

Flowable项目启动报错#java.time.LocalDateTime cannot be cast to java.lang.String

Flowable 项目启动后报错 flow项目第一次启动创建表成功&#xff0c;但是第二次启动时报错信息如下&#xff1a; 1、Error creating bean with name ‘appRepositoryServiceBean’ defined in class 2、Error creating bean with name ‘flowableAppEngine’: FactoryBean t…

立创小tips

立创小tips 原理图中 1-修改图纸属性 保存完&#xff0c;绘制原理图的界面就出现了&#xff0c;然后我们鼠标点击原理图的边缘变成红色就可以高边表格的属性了。 2-鼠标右键可以移动整个原理图 3-查看封装 点击任意一个元器件&#xff0c;在右侧就会显示封装属性&#xff…

基于fabric封装一个简单的图片编辑器(vue 篇)

介绍 前言vue demo版本react 版本 前言 对 fabric.js 进行二次封装&#xff0c;实现图片编辑器的核心功能。核心代码 不依赖 ui响应式框架vue ,react 都适用。 只写了核心编辑相关代码便于大家后续白嫖二次开发 核心代码我就没有打包发布 会 和 业务代码一起放到项目中。 vu…

socket通信(C语言+Python)

在socket文件夹下创建server.c和client.c。 服务端代码&#xff08;server.c&#xff09;&#xff1a; #include <stdio.h> #include <Winsock2.h> void main() {WORD wVersionRequested;WSADATA wsaData;int err;wVersionRequested MAKEWORD( 1, 1 );err WSAS…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《基于日间-日内不确定集的中长期电源扩展规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

SpringBoot整合RabbitMQ (持续更新中)

RabbitMQ 官网地址&#xff1a;RabbitMQ: One broker to queue them all | RabbitMQ RabbitMQ 与 Erlang 版本兼容关系​ 3.13.0 26.0 26.2.x The 3.13 release series is compatible with Erlang 26. OpenSSL 3 support in Erlang is considered to be mature and ready for…

kafka-重试和死信主题(SpringBoot整合Kafka)

文章目录 1、重试和死信主题2、死信队列3、代码演示3.1、appication.yml3.2、引入spring-kafka依赖3.3、创建SpringBoot启动类3.4、创建生产者发送消息3.5、创建消费者消费消息 1、重试和死信主题 kafka默认支持重试和死信主题 重试主题&#xff1a;当消费者消费消息异常时&…