1,本文主要对一个二维的图像数据做动态规划
此函数为每次处理一行或是一列的函数
/*********************************************************
src 输入图像的一行数据的指针
des 输出动态规划后的结果
ptr 动态规划后的行索引
step 行数据为1
n 每行的数据量 即图像的宽度
a
b
函数 ax2 + bx
range 动态规划的左右偏移
v prt 的临时变量
z 临时变量,交点值大小为宽度 + 1
*************************************************************/
void dynamicPlan(const float *src, float *dst, int *ptr,
int step, int n, float a, float b, float range,
int *v, float *z)
{
int k = 0;
v[0] = 0;
z[0] = -10000.0f;
z[1] = +10000.0f;
float eps = 0.00001f;
float a_inv = 1/a;
for (int q = 1; q <= n-1; q++)
{
float s = 0.5f * ((src[q*step] - src[v[k]*step]) / ((-a) * (q - v[k])) + q + v[k] - b * a_inv);
s = min(v[k]+range+eps, max(q-range-eps, s));
while (s <= z[k])
{
k--;
s = 0.5f * ((src[q*step] - src[v[k]*step]) / ((-a) * (q - v[k]))
+ q + v[k]
- b * a_inv);
s = min(v[k]+range+eps, max(q-range-eps, s));
}
k++;
v[k] = q;
z[k] = s;
}
z[k+1] = 10000.0f;
k = 0;
for (int q = 0; q <= n-1; q++)
{
while (z[k+1] < q)
k++;
dst[q*step] = a*(q-v[k])*(q-v[k]) + b*(q-v[k]) + src[v[k]*step];
ptr[q*step] = v[k];
}
}