精华内容
下载资源
问答
  • 相同的像素点用一条曲线拟合。如图。![图片说明](https://img-ask.csdn.net/upload/201803/23/1521775083_135625.jpg)其中不同颜色代表不同像素点。把它拟合成图二所示的。图二![图片说明]...
  • highcharts插件在动态曲线图上添加多条曲线时,只有最后一条曲线显示绘制动画![图片说明](https://img-ask.csdn.net/upload/201710/30/1509337681_332404.jpg)
  • 【实践】多条曲线在一幅图上,Origin如何对每一条曲线单独设置 双击图片的曲线,在弹出的设置窗口中找到Group中Edit Mode,将其设置成Independent。 点击左侧Graph1-->Layer1中的曲线,就可以单独设置了。 ...
        

    【实践】多条曲线在一幅图上,Origin如何对每一条曲线单独设置

    • 双击图片的曲线,在弹出的设置窗口中找到Group中Edit Mode,将其设置成Independent。
    • 点击左侧Graph1-->Layer1中的曲线,就可以单独设置了。

     

    展开全文
  • EXCEL如何在个图上画多条曲线?以及设置X/Y轴标题? 1.记得将X轴的数据输在上方,Y轴的数据输在下方。 2.选中X/Y轴的数据,然后插入–散点图 3.接下来就是绘制第二个曲线。单击图片,右键–选择数据 4.弹出如下...

    EXCEL如何在一个图上画多条曲线?以及设置X/Y轴标题?

    1.记得将X轴的数据输在上方Y轴的数据输在下方
    (或者X轴的数据输在左边Y轴的数据输在右边。)
    在这里插入图片描述
    2.选中X/Y轴的数据,然后插入–散点图
    在这里插入图片描述

    3.接下来就是绘制第二个曲线。单击图片,右键–选择数据
    在这里插入图片描述
    4.弹出如下图所示的小窗口,点击其中的–添加–选项,出现如下所示的选择数据框。
    在这里插入图片描述
    5.输入这条曲线的名称–单击X轴系列值(X)–然后鼠标框选X轴的数据范围–Y轴同理–然后单击确定
    在这里插入图片描述
    6.勾选添加X/Y轴坐标轴标题,图标标题,图例(也可以添加数据标签显示每一个点的数据值)
    在这里插入图片描述
    7.最后就完成啦!
    在这里插入图片描述

    展开全文
  • 一张像素为480,270的bmp图片,其中有一条封闭的曲线,以图片中心点为原点,画一条射线,求射线每旋转一度,和封闭曲线的交点的像素点的坐标。求出360个点的坐标。
  • [图片说明](https://img-ask.csdn.net/upload/202004/01/1585708902_591963.png)opc read和opc write中都是100个变量,对应wincc中的100个变量(这100个变量中的数据就是采集个正弦波信号得到的,是在),能将这...
  • 保存的是两条曲线的点坐标,曲线无函数表达式,但是两条曲线不相交,且大体有平行的趋向,能否通过机器学习或者其他方法分成两类?曲线大致图片我随手画了一张,大致如图ÿ...
  • B样条曲线

    2020-11-21 18:57:39
    B样条曲线引言截断函数平滑功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入段漂亮的代码片生成个适合你的列表创建个表格设定内容居中、居左、居右SmartyPants创建个...

    引言

    平滑的分片多项式空间是一种很好的函数逼近类。本文首先从截断函数角度出发以构造性的方式产生平滑分片多项式,即均匀B样条基函数,以及更一般的非均匀B样条基函数,并介绍基函数自身以及通过控制点、节点和对应基函数产生的B样条曲线的一些性质。

    截断函数平滑

    截断函数:定义在实数轴上,且只在一段区间上值为1,该区间以外值全为零的函数称为截断函数。
    函数插值:给定定义在实数轴上的四个函数f(x)f(x),g(x)g(x),u(x)u(x),v(x)v(x),I(x)=f(x)u(x)+g(x)v(x)I(x)=f(x)u(x)+g(x)v(x)叫做f(x)f(x),g(x)g(x)关于u(x)u(x)v(x)v(x)的插值,u(x)u(x)v(x)v(x)称为插值函数。

    给定一族定义在均匀区间上的截断函数Ni1(x)={1,x[i,i+1)0,otherN_{i}^{1}(x)=\left\{\begin{matrix}1,x\in[i,i+1) \\0,other \end{matrix}\right.
    (上标1表示该截断函数还未进行平滑操作,每进行一次操作上标+1)

    下面介绍使用这种简单的截断函数以及一些线性函数通过函数插值生成一些平滑曲线的方法。先从下面的一个简单例子开始:

    给定一个区间[0,1)上的截断函数N01(x)N_{0}^{1}(x),首先向右平移一个单位获得另一个区间[1,2)上的截断函数N11(x)N_{1}^{1}(x),接着定义两个值域为[0,1]、斜率相反、非零区间分别与f(x)f(x)g(x)g(x)相同的线性插值函数u(x)u(x)v(x)v(x)。具体来说,u(x)u(x)在[0,1]上是经过(0,0)和(1,1)的线性函数,在该区间外值为0。v(x)v(x)在[1,2]上是经过(1,1)和(2,0)的线性函数,在该区间外值为0。最后做N01(x)N_{0}^{1}(x),N11(x)N_{1}^{1}(x)关于u(x)u(x),v(x)v(x)的插值,即u(x)N01(x)+v(x)N11(x)u(x)N_{0}^{1}(x)+v(x)N_{1}^{1}(x),记为N02(x)N_{0}^{2}(x)。如下图

    函数关系为N02(x)=xN01(x)+(2x)N11N_{0}^{2}(x)=xN_{0}^{1}(x)+(2-x)N_{1}^{1}

    容易得到最终函数的解析式为{x,x[0,1)2x,x[1,2)0,other\left\{\begin{matrix}x,x\in[0,1) \\2-x, x\in[1,2) \\0,other \end{matrix}\right.
    操作一次之后,非零区间的长度增长。原先的N01(x)N_{0}^{1}(x)在区间端点处是不连续的,即C1C^{-1}连续,经过一次插值操作之后,在任一点都是C0C^{0}连续。同时在区间(0,2)中是分片一次多项式,在每一片上是C1C^{1}连续的,同时在端点1处是C0C^{0}连续的。

    如果不满足于一次多项式的阶数,我们可以对N02(x)N_{0}^{2}(x)再进行一次类似的插值操作,只需根据区间不同对插值函数做一点点改变,首先将N02(x)N_{0}^{2}(x)向右平移一个单位获得一个形状完全相同的函数记为N12(x)N_{1}^{2}(x)。新的插值函数u(x)u(x)在[0,2]上是经过(0,0)和(2,1)的线性函数,在该区间外为0。v(x)v(x)在[2,3]上是经过(2,1)和(3,0)的线性函数,在该区间外为0。最后做N02(x)N_{0}^{2}(x),N12(x)N_{1}^{2}(x)关于u(x)u(x),v(x)v(x)的插值。如下图

    最终函数我们记为N03(x)N_{0}^{3}(x),它的解析式不是很显然,但是我们容易得到如下函数关系式。
    N03(x)=t2N02(x)+3t2N12(x)N_{0}^{3}(x)=\frac{t}{2}N_{0}^{2}(x)+\frac{3-t}{2}N_{1}^{2}(x)其中N12(x)N_{1}^{2}(x)是直接通过平移得到,但只要仔细观察,可以发现这个函数可以通过区间[1,2)上的截断函数N11(x)N_{1}^{1}(x)模仿第一次平滑操作得到。它的解析式为{x1,x[1,2)3x,x[2,3)0,other\left\{\begin{matrix}x-1,x\in[1,2) \\3-x,x\in[2,3) \\0,other \end{matrix}\right.,代入上面关系式中计算可以得到N03N_{0}^{3}的解析式为
    {x22,x[0,1)x2+3x32,x[1,2)12x23x+92,x[2,3)0,other\left\{\begin{matrix}\frac{x^{2}}{2},x\in[0,1) \\-x^{2}+3x-\frac{3}{2},x\in[1,2) \\\frac{1}{2}x^{2}-3x+\frac{9}{2},x\in[2,3) \\0,other \end{matrix}\right.
    容易看出函数在区间(0,3)中是分片二次多项式,在每一片上是C2C^2连续的,且容易证明该函数在端点1,2处都是C1C^{1}连续的。

    类似的操作继续进行我们可以获得更大区间上的分片高阶多项式,同时在每片端点处都有很好的连续性。要注意的是每一步操作中插值函数u(x),v(x)u(x),v(x)都是值域为[0,1]的线性函数,它们的非零区间与两个被插值函数相同。每一步操作之后非零区间长度都会增加。下面是N01N_{0}^{1}经过六次操作之后的每一次操作产生的图形。

    我们可以不只从N01(x)N_{0}^{1}(x)开始。一般的,我们可以按照上面操作从任一个截断函数Ni1(x)N_{i}^{1}(x)开始不断生成一系列分片多项式Nik(x)N_{i}^{k}(x)。重述具体步骤为:
    1、将目标函数f(x)f(x)右移一个单位获得一个新的函数g(x)g(x)
    2、根据目标函数区间长度确定两个值域为1,非零区间与目标函数相同,斜率相反的插值函数u(x)u(x),v(x)v(x)
    3、做函数插值获得新的函f[2](x)=u(x)f(x)+v(x)g(x)数f^{[2]}(x)=u(x)f(x)+v(x)g(x)
    4、对f[2]f^{[2]}重复上面步骤

    我们出发点是均匀参数区间上的截断函数,因此容易得到递推方程如下:
    Nik(x)=xik1Nik1(x)+i+kxk1Ni+1k1(x),k2N_{i}^{k}(x)=\frac{x-i}{k-1}N_{i}^{k-1}(x)+\frac{i+k-x}{k-1}N_{i+1}^{k-1}(x),k\ge2xik1,i+kxk1\frac{x-i}{k-1},\frac{i+k-x}{k-1}是两个插值函数。从上面的过程以及递推公式可以很容易得到在每一个参数区间[xi,xi+1][x_{i},x_{i+1}]上都是k-1次多项式。我们将上述Nik(x)N_{i}^{k}(x)叫做kk阶(k-1次)均匀B样条基函数

    B样条基函数

    作为上述基函数的一般情况,我们可以从非均匀区间上的截断函数,即Ni1(t)={1,t[ti,ti+1)0,otherN_{i}^{1}(t)=\left\{\begin{matrix}1,t\in[t_{i},t_{i+1}) \\0,other \end{matrix}\right.开始生成B样条基函数。
    T={tit_{i}}是单调不减的一个序列,称为节点序列。tit_{i}叫做节点。且若tj1<tj=tj+1==tj+l1<tj+lt_{j-1}<t_{j}=t_{j+1}=\dots=t_{j+l-1}<t_{j+l},则tjtj+l1t_{j}\dots t_{j+l-1}ll重节点。我们允许节点序列中存在ll重节点,1lk1\le l\le k。允许重点,主要影响的是每一片上两端点的连续性,本文略。
    同样可以得到如下的递推方程:
    Nik(t)=ttiti+k1tiNik1(t)+ti+ktti+kti+1Ni+1k1(t),k2N_{i}^{k}(t)=\frac{t-t_{i}}{t_{i+k-1}-t_{i}}N_{i}^{k-1}(t)+\frac{t_{i+k}-t}{t_{i+k}-t_{i+1}}N_{i+1}^{k-1}(t),k\ge2
    我们将这种由任意节点向量定义的基函数叫做非均匀B样条基函数
    由于存在重点,因此规定如果存在0/0的项均为0,几何直观上便是该被插值函数的非零区间缩减成了一个空集,因此进行插值运算时忽略。要注意的是由于区间的不均匀,插值函数区间会发生变化,同时Ni+1k(t)N_{i+1}^{k}(t)几何直观上不再是Nik(t)N_{i}^{k}(t)简单平移得到,只能通过区间[ti+1,ti+2)[t_{i+1},t_{i+2})上的截断函数生成,也就是通过递推方程生成。
    从递推关系式可以发现一个基函数Nik(t)N_{i}^{k}(t)的值完全由(ti,ti+1ti+k)(t_{i},t_{i+1}\dots t_{i+k})k+1k+1个节点所确定。同时在每一个非零区间上[ti,ti+1][t_{i},t_{i+1}]上都是次数不超过k-1的多项式。
    下面主要就非均匀B样条基函数的性质进行一些讨论,对于均匀B样条有相似的结果。

    正性(Positivity)与局部支柱性(Support)

    Nik(t)={>0,t(ti,ti+k)=0,t[ti,ti+k]N_{i}^{k}(t)=\left\{\begin{matrix}>0,t\in(t_{i},t_{i+k}) \\=0,t\notin[t_{i},t_{i+k}] \end{matrix}\right.
    证明:k=1k=1时为截断函数,显然为真。假设对于k=l1k=l-1为真,
    递推关系式为Nil(t)=ttiti+l1tiNil1(t)+ti+ltti+lti+1Ni+1l1(t),k2N_{i}^{l}(t)=\frac{t-t_{i}}{t_{i+l-1}-t_{i}}N_{i}^{l-1}(t)+\frac{t_{i+l}-t}{t_{i+l}-t_{i+1}}N_{i+1}^{l-1}(t),k\ge2ti=ti+lt_{i}= t_{i+l},则ti=ti+l1t_{i}= t_{i+l-1}ti+1=ti+lt_{i+1}= t_{i+l},则由假设Nil1(t)0Ni+1l1(t)N_{i}^{l-1}(t)\equiv0\equiv N_{i+1}^{l-1}(t),由递推关系式,结论成立。当titi+lt_{i}\ne t_{i+l}时,ti+l1tit_{i+l-1}-t_{i}ti+lti+1t_{i+l}-t_{i+1}至少有一个正数,且另一个非负,不妨设ti+l1tit_{i+l-1}-t_{i}为正,则由归纳假设Nil1(t)N_{i}^{l-1}(t)(ti,ti+l1)(t_{i},t_{i+l-1})内为正,且插值函数ttiti+l1ti\frac{t-t_{i}}{t_{i+l-1}-t_{i}}在该区间上为正。若ti+lti+1t_{i+l}-t_{i+1}为正,同样得Ni+1l1(t)N_{i+1}^{l-1}(t)ti+ltti+lti+1\frac{t_{i+l}-t}{t_{i+l}-t_{i+1}}(ti+1,ti+l)(t_{i+1},t_{i+l})为正,且Nil1(t)N_{i}^{l-1}(t)Ni+1l1(t)N_{i+1}^{l-1}(t)x[ti,ti+l]x\notin[t_{i},t_{i+l}]时为0,因此由递推关系式结论成立。若ti+l=ti+1t_{i+l}=t_{i+1},则(ti,ti+l)=(ti,ti+l1)(t_{i},t_{i+l})=(t_{i},t_{i+l-1}),第一项在(ti,ti+k)(t_{i},t_{i+k})为正,[ti,ti+l][t_{i},t_{i+l}]外为0,第二项恒为零,结论成立。由归纳法结论成立。
    我们称区间t(ti,ti+k)t\in(t_{i},t_{i+k})NikN_{i}^{k}的支撑区间
    基函数的局部支柱性是B样条曲线具有局部控制性的关键。
    计算Nik(t)N_{i}^{k}(t)有如下代码.

    function result = N_i_k(i,k,knot,t)
    if k==1
        if(t<knot(i+1)&&t>=knot(i))
            result=1;
        else
            result=0;
        end
        return
    end
    if(knot(i+k-1)~=knot(i)&&knot(i+k)~=knot(i+1))
    result=(t-knot(i))/(knot(i+k-1)-knot(i))*N_i_k(i,k-1,knot,t)+(knot(i+k)-t)/(knot(i+k)-knot(i+1))*N_i_k(i+1,k-1,knot,t);
    end
    if(knot(i+k-1)==knot(i)&&knot(i+k)~=knot(i+1))
    result=(knot(i+k)-t)/(knot(i+k)-knot(i+1))*N_i_k(i+1,k-1,knot,t);
    end
    if(knot(i+k-1)~=knot(i)&&knot(i+k)==knot(i+1))
    result=(t-knot(i))/(knot(i+k-1)-knot(i))*N_i_k(i,k-1,knot,t);
    end
    end
    

    权性(Weighting property)
    i=0nNik(t)=1,t(tk1,tn+1),nN+\sum_{i=0}^{n}N_{i}^{k}(t)=1,t\in(t_{k-1},t_{n+1}),n\in N^{+}
    证明:由递推关系式我们可以得到i=0nNik(t)=i=0n(ttiti+k1tiNik1(t)+ti+ktti+kti+1Ni+1k1(t))\sum_{i=0}^{n}N_{i}^{k}(t)=\sum_{i=0}^{n}(\frac{t-t_{i}}{t_{i+k-1}-t_{i}}N_{i}^{k-1}(t)+\frac{t_{i+k}-t}{t_{i+k}-t_{i+1}}N_{i+1}^{k-1}(t))=tt0tk1t0N0k1(t)+tn+kttn+ktn+1Nn+1k1(t)+i=0nNik1(t)N0k1(t)=\frac{t-t_{0}}{t_{k-1}-t_{0}}N_{0}^{k-1}(t)+\frac{t_{n+k}-t}{t_{n+k}-t_{n+1}}N_{n+1}^{k-1}(t)+\sum_{i=0}^{n}N_{i}^{k-1}(t)-N_{0}^{k-1}(t)
    因此可以对kk用归纳法,由基函数的局部支柱性可以知道第一、二、四项在t(tk1,tn+1)t\in(t_{k-1},t_{n+1})均为0,第三项归纳假设为0,因此即证.

    B样条曲线

    定义了B样条基函数之后,类似Bezier曲线,我们可以定义如下的B样条曲线。
    假设{Pi}i=0n3\left\{ P_{i} \right\}_{i=0}^{n}\in\Re^{3},Nik(t)N_{i}^{k}(t)是相应于不均匀参数节点向量T={tj}j=0n+kT=\left\{t_{j}\right\}_{j=0}^{n+k}的k阶B样条基函数,则称
    p(t)=i=0nNik(t)Pi,tk1ttn+1p(t)=\sum_{i=0}^{n}N_{i}^{k}(t)P_{i},t_{k-1}\le t\le t_{n+1}
    为相应于参数节点T的k阶(k-1)次非均匀B样条曲线,称PiP_{i}为控制顶点。

    由B样条基函数递推式以及局部支柱性,确定每个基函数Nik(t)N_{i}^{k}(t)需要用到的节点为ti,ti+kt_{i},\dots t_{i+k}k+1k+1个节点,且支撑区间为(ti,ti+k)(t_{i},t_{i+k}),n+1n+1个控制顶点需要n+1n+1个B样条基函数Nik(t)N_{i}^{k}(t),因此定义如上参数节点T,同时他们的支撑区间的并集为(t0,tn+k)(t_{0},t_{n+k})

    注意到定义B样条曲线时的参数范围为tk1ttn+1t_{k-1}\le t\le t_{n+1}。我们以一个没有重节点的例子来分析一下这个问题。我们不妨将参数定义在整个[t0,tn+k][t_{0},t_{n+k}]上,随意画几个控制点按定义绘制曲线的形状如下。

    当我们按定义限制参数范围时,曲线如下

    当不限制参数范围时曲线的形状并不令人满意,没有按照控制点描绘我们需要的曲线。但在限制参数范围后,尽管曲线没有像Bezier那样插值两端,结果已经接近我们需要的了。

    注意观察参数区间范围的话,可以发现参数范围正好是基函数性质中使权和为1的范围。
    更细致的,我们分段考察B样条曲线的性质,首先将tt固定在[ti,ti+1][t_{i},t_{i+1}],由基函数局部支柱性知在这段区间上不恒为0的基函数分别为Nik+1k,Nik+2kNikN_{i-k+1}^{k},N_{i-k+2}^{k}\dots N_{i}^{k}kk个基函数,相应的曲线表达为:p(t)=j=0nNjk(t)Pj=j=ik+1iNjk(t)Pjp(t)=\sum_{j=0}^{n}N_{j}^{k}(t)P_{j}=\sum_{j=i-k+1}^{i}N_{j}^{k}(t)P_{j}因此每一个参数段上[ti,ti+1][t_{i},t_{i+1}]曲线只与kk个控制点Pik+1,PiP_{i-k+1},\dots P_{i}相关,且是这kk个点的一个凸组合。因此自然需要ik+10i-k+1\ge0ini\le n,于是k1ink-1\le i\le n,即有效区间为i=k1n[ti,ti+1]=[tk1,tn+1]\cup_{i=k-1}^{n}[t_{i},t_{i+1}]=[t_{k-1},t_{n+1}]。也即只有在这个区间上,每个点都是某些控制点的凸组合,区间之外的点并不能被控制点很好的控制,就像第一幅图表现的那样。
    (这是B样条局部控制的关键,每一段曲线仅由部分点控制,同时每个点只能影响一部分曲线)

    为了使得曲线能够插值两个端点,首先介绍如下两个引理.
    引理1.设节点序列ti<ti+1==ti+kt_{i}<t_{i+1}=\dots=t_{i+k},则Nik(t)={(tti)k1(ti+kti)k1,t[ti,ti+k)=0,t[ti,ti+k)N_{i}^{k}(t)=\left\{\begin{matrix}\frac{(t-t_{i})^{k-1}}{(t_{i+k}-t_{i})^{k-1}},t\in[t_{i},t_{i+k}) \\=0,t\notin[t_{i},t_{i+k}) \end{matrix}\right.
    于是,Nik(ti+1)=1N_{i}^{k}(t_{i+1})=1,Nik(ti)=0N_{i}^{k}(t_{i})=0.
    引理2.对节点序列ti==ti+k1<ti+kt_{i}=\dots=t_{i+k-1}<t_{i+k},则Nik(t)={(ti+kt)k1(ti+kti)k1,t[ti,ti+k)=0,t[ti,ti+k)N_{i}^{k}(t)=\left\{\begin{matrix}\frac{(t_{i+k}-t)^{k-1}}{(t_{i+k}-t_{i})^{k-1}},t\in[t_{i},t_{i+k}) \\=0,t\notin[t_{i},t_{i+k}) \end{matrix}\right.
    于是,Nik(ti)=1N_{i}^{k}(t_{i})=1,Nik(ti+1)=0N_{i}^{k}(t_{i+1})=0.

    对于一开始给的定义,我们改变参数两端节点的重数,使两端点的节点变成kk重节点.即节点序列为{t0=t1==tk1,tk,tk+1,tn+1=tn+2==tn+k}\left\{t_{0}=t_{1}=\dots=t_{k-1},t_{k},t_{k+1},\dots t_{n+1}=t_{n+2}=\dots=t_{n+k}\right\}.曲线仍然是p(t)=i=0nNik(t)Pi,tk1ttn+1p(t)=\sum_{i=0}^{n}N_{i}^{k}(t)P_{i},t_{k-1}\le t\le t_{n+1},范围也可以写为t0ttn+kt_{0}\le t\le t_{n+k}.
    观察第一个参数所对应的点即p(t0)=i=0nNik(t0)Pi,tk1ttn+1p(t_{0})=\sum_{i=0}^{n}N_{i}^{k}(t_{0})P_{i},t_{k-1}\le t\le t_{n+1}.根据引理容易得到N0k(t0)=1N_{0}^{k}(t_{0})=1,Njk(t0)=0,j>1N_{j}^{k}(t_{0})=0,j>1.于是p(t0)=P1p(t_{0})=P_{1}即插值了第一个点,同理可以证明p(tn+k)=Pnp(t_{n+k})=P_{n},插值最后一个点.于是便有如下曲线.

    上图的示例代码为

    Px=cos([linspace(0,3,5)]);
    Py=sin([linspace(0,3,5)]);
    plot(Px,Py,'-');
    knot=[2,2,2,2,4,8,8,8,8];
    t=2:0.01:8;
    for i=1:601
        x(i)=0;
        y(i)=0;
        for j=1:5
            x(i)=x(i)+N_i_k(j,4,knot,t(i))*Px(j);
            y(i)=y(i)+N_i_k(j,4,knot,t(i))*Py(j);
        end
    end
    plot(x,y,'.');
    

    参考书目:《计算机辅助几何设计》 王国瑾等

    展开全文
  • 曲线图片恢复数据

    2020-12-20 12:16:27
    以上图为例,是幅功率图,由2不同颜色的曲线组成,红色表示实际值和青色表示平均值。 横坐标是时间轴,0-7.25秒,纵坐标表示功率,最大功率1800瓦。 恢复数据的难点: 1、两种颜色的曲线有叠加的地方,分离不...

    很多应用是将传感器采集的数据绘制成曲线,如随时间变化的电流、电压或者功率。
    目前有个应用反过来,有数百张存放在pdf文档上的曲线截图,这些历史图片缺失了原始数据,需要根据分辨率很低的图片将数据恢复过来。
    这类应用通常是AI大数据分析的前端,恢复效果直接影响数据的质量。

    原始图片:
    功率图

    以上图为例,是一幅功率图,由2条不同颜色的曲线组成,红色表示实际值和青色表示平均值。
    横坐标是时间轴,0-7.25秒,纵坐标表示功率,最大功率1800瓦。

    恢复数据的难点:
    1、两种颜色的曲线有叠加的地方,分离不容易;
    2、背景很多干扰,需要去除这些噪音,比如文字,格子线,选择十字线。

    实现方法
    使用OpenCV3,采样C/C++编程。
    一、为了方便批处理,手工采集图片时文件名包含更多的信息:
    如:Wrc_7.52_1800_场地信息_序号_日期时间.png
    最重要的横坐标、纵坐标的信息包含在里面。
    二、分离不同颜色曲线
    因为图片是多条不同颜色的曲线叠加,需要将其逐一分离。
    基本原理是将图像由BGR转为HSV空间,再根据不同颜色有不同的H值,将这个范围的H值保留。

    void colorFilter(char color, Mat& inputImage, Mat& outputImage)
    {
    	int low0 = -1;
    	int low1 = -1;
    	int high0 = -1;
    	int high1 = -1;
    
    	if (color == 'r') {  // 红色
    		low0 = 0;
    		low1 = 20;
    		high0 = 120;
    		high1 = 180;
    	}
    	else if (color == 'g') {  // 绿色
    		high0 = 35;
    		high1 = 77;
    	}
    	else if (color == 'b') {  // 蓝色
    		high0 = 100;
    		high1 = 124;
    	}
    	else if (color == 'y') {  // 黄色
    		high0 = 26;
    		high1 = 34;
    	}
    	else if (color == 'c') {  // 青色
    		high0 = 78;
    		high1 = 99;
    	}
    	else {
    		printf("color err: %c\n", color);
    		outputImage = inputImage;
    		return;
    	}
    
    	Mat hsv;
    	cvtColor(inputImage, hsv, CV_BGR2HSV);
    	int width = hsv.cols;
    	int height = hsv.rows;
    	for (int i = 0; i < height; i++) {
    		for (int j = 0; j < width; j++) {
    			int H = hsv.at<Vec3b>(i, j)[0];
    			int S = hsv.at<Vec3b>(i, j)[1];
    			if (!((low0>=0 && H >= low0 && H <= low1) || (H >= high0 && H <= high1))) {
    				hsv.at<Vec3b>(i, j)[0] = 0;
    				hsv.at<Vec3b>(i, j)[1] = 0;
    				hsv.at<Vec3b>(i, j)[2] = 0;
    			}
    
    		}
    	}
    	cvtColor(hsv, outputImage, CV_HSV2BGR);
    }
    

    效果如下:
    在这里插入图片描述
    在这里插入图片描述

    三、定位坐标
    二值化后进行处理。
    从上到下扫描到第一根横线,作为y轴的顶点线
    从下到上扫描到第一根横线,作为x轴,也就是y轴的起点线。
    从左到右扫描到第一根竖线,作为y轴,也就是x轴的0点。
    图片的最右,作为x轴的终点。
    定位好了后,有了这些值,就可以算出比率,即值和像素之比了。

    四、值的转换
    根据采样率,计算x轴的采样间隔。
    y轴,根据像素距离和比率,就可以还原出实际的值。

    五、异常的处理
    如果在某些位置有多种颜色粘连重叠,无法准确分离,则可以取原始图片的二值化后的值。
    有些图片的十字虚线(原始绘图软件的选择线),线型比较粗,往往二值化后消除不掉,会对识别产生干扰,需要判断当前点是不是处于虚线上。
    有些位置,二值化后曲线出现断裂,即读取不到值,可以取前一个值。

    上述图片经处理后获取的数据:
    r:
    0,0,0,0,0,79,116,417,491,1333,1179,841,724,589,565,522,509,497,491,491,485,473,466,442,436,423,423,423,423,430,442,466,466,473,460,454,442,430,423,423,423,430,436,442,442,442,454,466,460,448,454,460,460,460,466,473,473,479,485,485,491,491,491,497,497,503,503,503,509,509,509,516,516,516,522,522,522,522,528,534,534,540,540,546,546,546,552,552,552,559,559,565,571,571,571,571,571,577,577,577,583,583,583,589,595,595,602,602,602,608,608,614,614,614,614,614,602,589,565,583,595,602,602,608,595,571,559,540,546,577,620,663,681,694,724,761,786,804,798,774,755,737,712,700,663,638,614,565,540,534,522,522,522,350,313,264,227,221,190,172,135,116,110,110,104,104,104,104,104,104,104,104,104,104,104,104,104,104,104,86,73,55,24,18,0,0,0,0
    c:
    0,0,0,0,43,30,67,0,958,872,1455,1449,749,700,657,583,552,540,528,522,516,509,503,485,473,448,442,436,442,460,473,497,503,509,509,509,491,479,466,454,454,454,454,454,454,454,436,454,448,466,479,479,473,466,473,479,460,466,466,473,479,479,485,485,485,491,485,485,491,491,497,503,503,503,503,503,503,503,503,509,509,516,516,516,516,516,516,522,522,522,522,528,522,522,528,528,522,522,522,522,522,522,522,522,522,528,528,528,528,528,528,528,528,528,534,534,534,534,534,534,540,534,528,522,516,503,503,509,509,503,503,534,571,583,583,583,571,540,540,540,540,534,528,522,516,491,491,485,479,479,479,473,430,282,270,239,202,196,147,141,116,104,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,86,92,36,30,12,0,0,0,0,0

    为了方便验证,如果可以将其保存为csv文件(逗号分隔的文本文件),然后用Excel打开,选择插入/曲线,效果如下:
    在这里插入图片描述
    从Excel绘制出的图片来看,效果还是不错的,和原图几乎一模一样。
    软件最后做成了可以扫描目录,逐个文件进行批处理操作。

    展开全文
  • 想要做64通道的显示窗口,效果如图:![图片说明]...但是如果直接添加graph的话因为每一条曲线的横纵坐标都差不多会重合到一起,有什么办法可以画出来和图片上差不多的曲线图呢
  • 这是一张绿色简洁曲线PPT背景图片,第PPT模板网提供简洁简约幻灯片背景图片免费下载; 关键词:绿色曲线PPT背景图片,简洁线条PowerPoint背景图片,.PPTX格式;
  • ![图片说明](https://img-ask.csdn.net/upload/201508/18/1439874754_348556.png)
  • 妹语音讲解视频教程戳这里观看:SketchUp流线艺术楼梯建模思路_腾讯视频完整视频点击文末【了解更多】进行查看优秀作业图文解析01 用户:4511939751、先按照图片的大致估算一下画出最里面踏步的形状线条 (我用的是...
  • ![图片说明](https://img-ask.csdn.net/upload/201911/30/1575078101_793617.png)
  • [图片说明](https://img-ask.csdn.net/upload/201904/17/1555511848_354992.png) clear all clc inputNums=15; %输入层节点数 outputNums=81; %输出层节点数 hideNums=81; %隐含层节点数 maxcount=100; %...
  • 简介:这是份以粉色为背景色,以抽象曲线为主题元素的PPT背景图片,给人种柔和淡雅的感受,非常温馨烂漫。本幻灯片背景图片用途比较广泛。下载附件包括宽屏和普屏两种分辨率的尺寸; 关键词:曲线 线条PPT背景...
  • 然后用白色画笔覆盖,留一条曲线出来就行。第二步,打开getdata软件。第三步,打开图像。第四步,设置坐标。第五步,取出数据。第六步 导出数据 可以用getdata自带的,麻烦。提倡直接鼠标拉取想要的数据。拉取选好后...
  • 简介:这是份简洁优美的,蓝色曲线艺术PowerPoint背景图片,第PPT提供宽屏和普屏两种分辨率的JPG格式图片下载; 关键词:蓝色 曲线 线条 抽象PPT背景图片,艺术幻灯片背景图片下载,4:3 ,16:9 ,.JPG格式;
  • 简介:这是份青色背景的,艺术设计PPT背景图片,作者只用了几条曲线就勾勒出了这份幻灯片背景。本幻灯片背景图片为普屏4:3分辨率,jpg格式;
  • 请问大佬们,怎么使用前台代码绑定多折线数据,并且折线数据的个数不固定。 ``` <visifire:DataMapping MemberName="YValue" Path="yValue"></visifire:DataMapping> ...
  •    GDI+的矢量绘图部分被用来绘制线条、绘制曲线和填充图形。... <br />电脑显示器在个矩形点阵(即分辨率)上创建其显示画面,这些点称为图片要素或者象素。不同的显示器其在屏幕
  • 疾病预后研究中,生存曲线是必不可少的素材之,其重要性不言而喻。那么,当获取到生存数据后应该如何绘制幅对得起读者和编辑的生存曲线呢?在目前的科学绘图界,呈现出Sigmaplot,GraphPad Prism和Origin三分...
  • 2,在一张图中显示多条曲线 3,在个窗口显示多张图片 注意: 1,问题背景 在次任务中,老师给出了几个公式,其中含有三个自变量λ、μ、c。因为要观察最终的结果受这三个变量的影响,所以采用如下的展示方式...
  • 这是份以深蓝色为背景色的,商务幻灯片模板。 幻灯片以各种曲线、线条、3D立体箭头等作为幻灯片模板...关键词:蓝色PPT背景,曲线、线条、地球PowerPoint背景图片,科技幻灯片模板,商务PPT模板下载,.PPTX格式;
  •  跟着我的思路往下走(f也是这样一步一步去画的)首先画出一条贝塞尔曲线,然后控制曲线旋转角度不断变化,视觉上就感觉是一个中心固定的几条贝塞尔曲线在旋转,也可以同时画出几条贝塞尔曲线,控制旋转来达到类似...
  • 在按照本系列内容中第29~31部分中所介绍的方法在仪器附带的数据分析软件中进行基本的作图、基本的数学处理并根据需要标注出TG曲线可以...1.软件中多条曲线的对比与分析方法作为软件的基本功能之,在大多数商品化仪...
  • 以下文章来源于Python小例子,作者 Emily今天教大如何完整绘制出下面的图形了: 原图如下,与上图相比,缺少一条曲线,x、y轴的线条颜色不清楚,今天我们添加这些功能。 添加曲线在add_yaxis一条曲线,代码如下,...
  • 示例地址:https://konvajs.org/docs/sandbox/Modify_Curves_with_Anchor_Points.html个二阶和三阶贝塞尔曲线的例子。不过示例代码都是原生js,代码还需转换成es6代码 说下思路,刚看完例子,给我感觉是基
  • im = imread('c.png'); im = rgb2gray(im); im = im2double(im); ...[row ,clo] = size(im);...比如一张图片我能画出通过plot画出经过相应点的数据曲线,但是要怎么才能画出过该点的任意一条直线的数据图片

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 373
精华内容 149
关键字:

一条曲线图片