- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试实现如下所示的一些功能
为此,我正在尝试使用 Cubic interpolation
和 Catmull interpolation
(分别检查两者以比较最佳结果),我不明白的是这些插值的影响在图像上显示以及我们如何在单击以设置该曲线的位置获得这些点值?是否需要分别定义图像上这些黑点的函数?
我正在从这些资源中获得帮助
编辑
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);
这是它的样子:
绿色箭头表示推导错误(总是只在整条曲线的起点和终点)。可以通过在所有其他控制点之前和之后添加 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)=y1
和 y(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;
}
在顶部有每个 R,G,B
的控制点.左下角是原始图像,右下角是校正后的图像。
关于c++ - 三次样条和 catmull 样条对图像的影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23614037/
我正在尝试实现如下所示的一些功能 为此,我正在尝试使用 Cubic interpolation 和 Catmull interpolation(分别检查两者以比较最佳结果),我不明白的是这些插值的影响
我有以下代码来计算四个控制点之间的点以生成 catmull-rom 曲线: CGPoint interpolatedPosition(CGPoint p0, CGPoint p1, CGPoint p
我读过一些介绍使用 GL_LINEAR 进行快速三阶插值的文章。 [1] http://http.developer.nvidia.com/GPUGems2/gpugems2_chapter20.ht
在创建我的 Catmull Rom Spline 之后,例如: vector3 SplineVector = newSpline.createCatmulRomSpline(vectorOne, ve
注意:描述比预期的要长一些。您知道使用此网格实现此算法的可读吗?请让我知道! 我正在尝试实现 Catmull-Clark subdivision使用 Matlab,因为稍后必须将结果与已经在 Matl
如果我有一个 Catmull-Rom spline一定长度如何计算它在一定距离处的位置?通常要计算 catmull rom 样条曲线中的点,您输入一个介于 0 和 1 之间的值以通过比例获得其位置,我
我正在尝试创建一个类,它接受任意数量的点(位置和控制)并根据给定的信息创建一个 catmull-rom 样条。 我正在做的——我真的不确定这是否是正确的做法——将每个单独的点存储在一个类中,如下所示:
来自 this site ,里面好像有关于Catmull-Rom样条的最详细的信息,看来创建样条需要四个点。但是,它没有提到点 p0 和 p3 如何影响 p1 和 p2 之间的值。 我的另一个问题是如
我正在尝试使用 SVG 路径创建高性能、美观的铅笔工具。 我正在记录鼠标坐标以绘制路径。为了获得高保真路径(精确到用户的运动),我需要为每个像素运动记录一个点。 保持路径中的每一个点都会产生大量的点,
我对它们之间的关系有点困惑。在我的课上,我的教授询问如何使用自动计算的切线将 C1 连续分段 Hermite 曲线拟合到 x 个点。有人可以解释这是如何工作的吗? 最佳答案 埃尔米特样条是 的一种方法
我到达了这个 [Catmull-Rom Spline][1],我需要更改代码以使用相同的平滑曲线闭合循环。如果我将前两个数字(x0,x1)添加到名为“points”的数组的末尾,循环将关闭,但我没有得
我正在尝试从 Unity 中的点列表生成 Catmull-Rom 曲线。因为我不想在曲线的点之间存储点,所以我选择使用可以根据时间计算 Catmull-Rom 曲线中位置的解决方案。这有几个例子,he
我想在我的屏幕上生成一个随机样条。这是我目前所拥有的: public class CurvedPath { Random rn; CatmullRomSpline curve; float[] xPt
我正在尝试找到一种在 android 平台上实现 catmull-rom 样条曲线的方法,目的是通过 n 个点平滑地绘制一条线。理想情况下,我将能够通过 Path 及其cubicTo 方法来适应三次贝
简要背景:我正在开发一个基于网络的绘图应用程序,需要绘制通过其控制点的 1px 粗样条线。 我遇到的问题是我需要像使用 1px 铅笔工具一样绘制 p1 和 p2 之间的每个像素。因此,一次没有抗锯齿和
我正在尝试使用 C++ 和 OpenCV 实现用于图像缩放的样条 Catmull-Rom。我进行了两个测试,第一个是图像缩放 (X2),第二个是图像重建(缩放图像抽取)。我的问题是,当我显示像素值时,
我是一名优秀的程序员,十分优秀!