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

2024-06-08 13:20

本文主要是介绍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++代码。

这篇关于C++| 一维线性插值、imadjust函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

C++ HTTP框架推荐(特点及优势)

《C++HTTP框架推荐(特点及优势)》:本文主要介绍C++HTTP框架推荐的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. Crow2. Drogon3. Pistache4. cpp-httplib5. Beast (Boos

PyTorch中cdist和sum函数使用示例详解

《PyTorch中cdist和sum函数使用示例详解》torch.cdist是PyTorch中用于计算**两个张量之间的成对距离(pairwisedistance)**的函数,常用于点云处理、图神经网... 目录基本语法输出示例1. 简单的 2D 欧几里得距离2. 批量形式(3D Tensor)3. 使用不

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

C++类和对象之初始化列表的使用方式

《C++类和对象之初始化列表的使用方式》:本文主要介绍C++类和对象之初始化列表的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C++初始化列表详解:性能优化与正确实践什么是初始化列表?初始化列表的三大核心作用1. 性能优化:避免不必要的赋值操作2. 强

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

Kotlin运算符重载函数及作用场景

《Kotlin运算符重载函数及作用场景》在Kotlin里,运算符重载函数允许为自定义类型重新定义现有的运算符(如+-…)行为,从而让自定义类型能像内置类型那样使用运算符,本文给大家介绍Kotlin运算... 目录基本语法作用场景类对象数据类型接口注意事项在 Kotlin 里,运算符重载函数允许为自定义类型重

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中