图像处理中二次曲线拟合

2016/7/16


 

在一次提取发光管的中心线程序中,由于我们只拍到了断续而弯曲的发光管,所以无法使用光带中心线提取的方法进行提取。

在此背景下,我想到了拟合。之前有学过直线拟合的方法,名为最小二乘法。其基本步骤如下:

(1)    设需要拟合的直线为y=a*x+b。

(2)    首先选取进行拟合的点集,选取方法可以为阈值分割,模板匹配等,设最后选出的点集为。

(3)    求该点集到直线的距离平方和,

(4)    对Sum分别求关于x,y的偏导函数。

(5)    根据偏导求出该距离平方和最小时的a,b值即为拟合的曲线的参数。

为了与之后的二次曲线拟合做对比,我写了下直线拟合的函数,先从源图像中根据阈值分割选取拟合点集(这里我认为灰度值超过45即被选取),再根据上述步骤计算a,b的值。源代码如下:

/*输入为三通道图像*/

/*对图像中的亮点进行直线拟合*/

void cvLineFit1D(IplImage* src_getin)

{

    IplImage*src =cvCloneImage(src_getin);

    IplImage*image_threshold = cvCreateImage(cvGetSize(src),8,1);

    cvCvtColor(src,image_threshold,CV_BGR2GRAY);

    cvThreshold(image_threshold,image_threshold,45,255,CV_THRESH_BINARY);

    cvShowImage("cvLineFit1D[Threshold]",image_threshold);

 

    //设拟合的二次曲线方程为y=ax+b;

    //先求出各点到拟合直线上的距离的平方和;

    //求出使得该平方和最小的a,b的值 ;

    long long int k1=0;

    long long int k2=0;

    long long int k3=0;

    long long int k4=0;

    long long int k5=0;

    long long int k6=0;

    for (inti=0;i<image_threshold->height;i++)

    {

        for (intj=0;j<image_threshold->width;j++)

        {

            if(cvGetReal2D(image_threshold,i,j)==255)

            {

                k1+=2*i*i;

                k2+=2*i;

                k3+=2*i*j;

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB,可以使用polyfit函数进行二次曲线。polyfit函数是用于多项式的函数之一,它可以根据给定的数据点,出一个指定次数的多项式曲线。 下面是使用polyfit函数进行二次曲线的步骤: 1. 准备数据:首先,你需要准备一组数据点,包括自变量和因变量的值。 2. 使用polyfit函数:使用polyfit函数来进行二次曲线。该函数的语法如下: ``` p = polyfit(x, y, n) ``` 其,x是自变量的值,y是因变量的值,n是多项式的次数(对于二次曲线,n为2)。 3. 获取结果:polyfit函数会返回一个多项式系数向量p,其p(1)表示二次项的系数,p(2)表示一次项的系数,p(3)表示常数项的系数。 4. 绘制曲线:使用polyval函数来计算曲线上的点,并将其绘制出来。该函数的语法如下: ``` y_fit = polyval(p, x) ``` 其,p是多项式系数向量,x是自变量的值,y_fit是曲线上对应x值的因变量的估计值。 下面是一个示例代码,演示如何在MATLAB进行二次曲线: ```matlab % 准备数据 x = [1, 2, 3, 4, 5]; y = [2.1, 3.9, 7.2, 9.5, 12.1]; % 二次曲线 p = polyfit(x, y, 2); % 计算曲线上的点 x_fit = linspace(min(x), max(x), 100); y_fit = polyval(p, x_fit); % 绘制原始数据和曲线 plot(x, y, 'o', x_fit, y_fit); legend('原始数据', '曲线'); ``` 希望以上内容对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值