赞
踩
前言:最近要从Matlab代码改C++代码,不能直接用Matlab生成的C代码,因为需要嵌入到已有项目中。Matlab本身有很多很方便的数学公式,但是在C++里没有相关的库的话,需要自己实现。
Matlab中的interp1函数插值类型有很多:
本文编写的是linear线性插值,其实是分段线性插值,分段线性插值就是线性插值的原理。
从分段线性插值图像结果来看,其实就是分别对相邻两个点进行线性插值。新的x点如果落在了相邻两个点之间就用对应的线性插值计算,但是如果新的x点落在了最大和最小以外,这个可以用离得最近的两个相邻点作为线性插值的斜率计算。
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;
}
Matlab中的imadjust函数可以对图像进行灰度调整,调用格式如下:
J=imadjust( I,[low_in;high_in],[low_out;high_out],gamma);
该函数的功能,输入图像数据I:
结合图像来理解更为直观:
其中gamma变换,是一个固定的公式
s
=
c
r
γ
s=cr^γ
s=crγ,在gamma为1的时候是线性变换,函数图像如下图:
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;
}
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。