gpt4 book ai didi

c++ - 三次样条和 catmull 样条对图像的影响

转载 作者:太空狗 更新时间:2023-10-29 20:59:52 25 4
gpt4 key购买 nike

我正在尝试实现如下所示的一些功能

enter image description here

为此,我正在尝试使用 Cubic interpolationCatmull interpolation(分别检查两者以比较最佳结果),我不明白的是这些插值的影响在图像上显示以及我们如何在单击以设置该曲线的位置获得这些点值?是否需要分别定义图像上这些黑点的函数?

我正在从这些资源中获得帮助

Source 1

Source 2

Approx the same focus

编辑

int main (int argc, const char** argv)
{
Mat input = imread ("E:\\img2.jpg");
for(int i=0 ; i<input.rows ; i++)
{
for (int p=0;p<input.cols;p++)
{
//for(int t=0; t<input.channels(); t++)
//{

input.at<cv::Vec3b>(i,p)[0] = 255*correction(input.at<cv::Vec3b>(i,p)[0]/255.0,ctrl,N); //B
input.at<cv::Vec3b>(i,p)[1] = 255*correction(input.at<cv::Vec3b>(i,p)[1]/255.0,ctrl,N); //G
input.at<cv::Vec3b>(i,p)[2] = 255*correction(input.at<cv::Vec3b>(i,p)[2]/255.0,ctrl,N); //R
//}
}
}

imshow("image" , input);
waitKey();
}

最佳答案

所以如果你的控制点总是在同一个x坐标上
并沿整个范围线性分散然后你可以这样做:

//---------------------------------------------------------------------------
const int N=5; // number of control points (must be >= 4)
float ctrl[N]= // control points y values initiated with linear function y=x
{ // x value is index*1.0/(N-1)
0.00,
0.25,
0.50,
0.75,
1.00,
};
//---------------------------------------------------------------------------
float correction(float col,float *ctrl,int n)
{
float di=1.0/float(n-1);
int i0,i1,i2,i3;
float t,tt,ttt;
float a0,a1,a2,a3,d1,d2;
// find start control point
col*=float(n-1);
i1=col; col-=i1;
i0=i1-1; if (i0< 0) i0=0;
i2=i1+1; if (i2>=n) i2=n-1;
i3=i1+2; if (i3>=n) i3=n-1;
// compute interpolation coefficients
d1=0.5*(ctrl[i2]-ctrl[i0]);
d2=0.5*(ctrl[i3]-ctrl[i1]);
a0=ctrl[i1];
a1=d1;
a2=(3.0*(ctrl[i2]-ctrl[i1]))-(2.0*d1)-d2;
a3=d1+d2+(2.0*(-ctrl[i2]+ctrl[i1]));
// now interpolate new colro intensity
t=col; tt=t*t; ttt=tt*t;
t=a0+(a1*t)+(a2*tt)+(a3*ttt);
return t;
}
//---------------------------------------------------------------------------

它使用 4 点 1D 插值立方体(来 self 上面评论中的那个链接)来获得新颜色,只需这样做:

new_col = correction(old_col,ctrl,N);

这是它的样子:

interpolation example

绿色箭头表示推导错误(总是只在整条曲线的起点和终点)。可以通过在所有其他控制点之前和之后添加 2 个控制点来纠正...

[注释]

颜色范围是< 0.0 , 1.0 >因此,如果您需要其他,则只需将结果相乘并除以输入 ...

[edit1] 开始/结束推导修正了一点

float correction(float col,float *ctrl,int n)
{
float di=1.0/float(n-1);
int i0,i1,i2,i3;
float t,tt,ttt;
float a0,a1,a2,a3,d1,d2;
// find start control point
col*=float(n-1);
i1=col; col-=i1;
i0=i1-1;
i2=i1+1; if (i2>=n) i2=n-1;
i3=i1+2;
// compute interpolation coefficients
if (i0>=0) d1=0.5*(ctrl[i2]-ctrl[i0]); else d1=ctrl[i2]-ctrl[i1];
if (i3< n) d2=0.5*(ctrl[i3]-ctrl[i1]); else d2=ctrl[i2]-ctrl[i1];
a0=ctrl[i1];
a1=d1;
a2=(3.0*(ctrl[i2]-ctrl[i1]))-(2.0*d1)-d2;
a3=d1+d2+(2.0*(-ctrl[i2]+ctrl[i1]));
// now interpolate new colro intensity
t=col; tt=t*t; ttt=tt*t;
t=a0+(a1*t)+(a2*tt)+(a3*ttt);
return t;
}

[edit2] 只是对系数的一些说明

都是从这个条件推导出来的:

y(t) = a0 + a1*t + a2*t*t + a3*t*t*t // direct value
y'(t) = a1 + 2*a2*t + 3*a3*t*t // first derivation

现在你有积分了y0,y1,y2,y3所以我选择了y(0)=y1y(1)=y2这给出了 c0 连续性(曲线之间的连接点的值相同)
现在我需要c1连续性所以我添加y'(0)必须与 y'(1) 相同从以前的曲线。
对于y'(0)我选择点之间的平均方向 y0,y1,y2
对于y'(1)我选择点之间的平均方向 y1,y2,y3
这些对于下一个/上一个片段是相同的,所以就足够了。现在把它们放在一起:

y(0)  = y0           = a0 + a1*0 + a2*0*0 + a3*0*0*0
y(1) = y1 = a0 + a1*1 + a2*1*1 + a3*1*1*1
y'(0) = 0.5*(y2-y0) = a1 + 2*a2*0 + 3*a3*0*0
y'(1) = 0.5*(y3-y1) = a1 + 2*a2*1 + 3*a3*1*1

并求解这个方程组 (a0,a1,a2,a3 = ?) .您将在上面的源代码中得到我所拥有的。如果您需要曲线的不同属性,则只需创建不同的方程式即可...

[edit3] 用法

pic1=pic0; // copy source image to destination pic is mine image class ...
for (y=0;y<pic1.ys;y++) // go through all pixels
for (x=0;x<pic1.xs;x++)
{
float i;
// read, convert, write pixel
i=pic1.p[y][x].db[0]; i=255.0*correction(i/255.0,red control points,5); pic1.p[y][x].db[0]=i;
i=pic1.p[y][x].db[1]; i=255.0*correction(i/255.0,green control points,5); pic1.p[y][x].db[1]=i;
i=pic1.p[y][x].db[2]; i=255.0*correction(i/255.0,blue control points,5); pic1.p[y][x].db[2]=i;
}

example

在顶部有每个 R,G,B 的控制点.左下角是原始图像,右下角是校正后的图像。

关于c++ - 三次样条和 catmull 样条对图像的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23614037/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com