椭圆拟合之最小二乘法

原理:可能以后的篇幅再详细写了,

代码:

QImage inputImage :输入图像;

float ellipse : 输出椭圆的各个参数

bool Vertical : 是否垂直

bool total : 椭圆是否有上下部分,还是只是椭圆的一段曲线

void Ellipse(QImage *inputImage,float* ellipse,bool Vertical,bool total)

{

vector> XX_mats;

// double x[2];

vector x_mats;

vector y_mats;

int Min_x = 100000,Max_x = 0;

float b = 100000;

float Max_a = 0;

float a;

int y_Min = 0, y_Max = 0;

float X0,Y0;

//初始值

float sum_x = 0;

float sum_y = 0;

int width = inputImage->width();

int height = inputImage->height();

for(int i = 25; i

{

for(int j = 25; j

{

if(QColor(inputImage->pixel(j,i)).red() == 255)

{

if(j>Max_x)

{

Max_x = j;

y_Max = i;

}

if(j

{

Min_x = j;

y_Min = i;

}

sum_y += i;

sum_x += j;

x_mats.push_back(j);

y_mats.push_back(i);

}

}

}

if(total)

{

X0 = sum_x /x_mats.size();

Y0 = sum_y / y_mats.size();

}

else {

X0 = ((Max_x + Min_x) / 2);

Y0 = ((y_Max + y_Min) / 2);

}

cout<

a = sqrtf(powf((Max_x-Min_x),2)+powf((y_Max - y_Min),2)) / 2.0 ;

for(int k=0; k

{

float juli = sqrtf(powf((x_mats[k]-X0),2) + powf((y_mats[k] - Y0),2));

if(juli

{

b = juli;

}

if(juli>Max_a)

{

Max_a = juli;

}

}

//a=Max_a;

float tem;

if(Vertical)

{

tem = a;

a = b;

b = tem;

}

float A = a*a;

float B = b*b;

float sum_0 = 0;

for(int j = 0; j

{

float y = powf((y_mats[j] - Y0),2) / B;

float x = powf((x_mats[j] - X0),2) / A;

sum_0 += powf((1-x-y),2);

}

cout<

float theta =0;

float s1 = 1.0f / x_mats.size();

float learn = 1.0f;

float* hmatrix = new float[x_mats.size()];

memset(hmatrix,0,x_mats.size() * sizeof(float));

//梯度下降

float sum_min = 1000.0;

int countes = 0;

for(int i = 0;i<13140;i++)

{

bool kaiguang = true;

float sum_1 = 0,sum_2 = 0,sum_3 = 0,sum_4 = 0,sum_5 = 0,sum = 0;

for(int j = 0; j

{

float cx = x_mats[j] - X0;

float cy = y_mats[j] - Y0;

float x = cx * cos(theta) - cy * sin(theta);

float y = cx * sin(theta) + cy * cos(theta);

x = (x * x) / powf(a,2);

y = (y * y) / powf(b,2);

//float y = powf((y_mats[j] - Y0),2) / B;

//float x = powf((x_mats[j] - X0),2) / A;

hmatrix[j] = 1 - x -y;

}

for(int j = 0; j

{

float cx = x_mats[j] - X0;

float cy = y_mats[j] - Y0;

float x = cx * cos(theta) - cy * sin(theta);

float y = cx * sin(theta) + cy * cos(theta);

sum_1 += hmatrix[j] * (2) * (x*cos(theta) / powf(a,2) + y*sin(theta) / powf(b,2));

sum_2 += hmatrix[j] * (2) * (x*sin(theta) / powf(a,2) + y*cos(theta) / powf(b,2));

sum_3 += hmatrix[j] * (2) * (powf(x,2) / powf(a,3));

sum_4 += hmatrix[j] * (2) * (powf(y,2) / powf(b,3));

sum_5 += hmatrix[j] * (2) * ((x*(-y)) / powf(a,2) + (y*x) / powf(b,2));

sum += powf(hmatrix[j],2);

}

if(sum

{

sum_min = sum;

kaiguang = false;

}

if(kaiguang)

{

if(fabs(sum - sum_min)<= 0.00001)

{

countes +=1;

if(countes >= 11)

{

break;

}

}

}

sum_1 = learn*s1*sum_1;

sum_2 = learn*s1*sum_2;

sum_3 = learn*s1*sum_3;

sum_4 = learn*s1*sum_4;

sum_5 = learn*s1*sum_5;

// 更新 参数theta

X0 = X0 - sum_1;

Y0 = Y0 - sum_2;

a = a - sum_3;

b = b - sum_4;

theta = theta + sum_5;

cout<

}

/**/

for(int i = 0; iheight()/2;i++)

{

for(int j = 25; jwidth()-10; j++)

{

/*

float y = sqrtf(b*b - ((b*b)/(a*a))*(j-X0)*(j-X0)) + Y0;

y1 = Y0 - sqrtf(b*b - ((b*b)/(a*a))*(j-X0)*(j-X0));

sum_0 += sqrtf(powf((y_mats[j] - y),2.0));

if(y>0&&y<890)

{

inputImage->setPixel(j,int(y+0.3),qRgb(0,255,0));

}

if(y1>0&&y1<900)

inputImage->setPixel(j,int(y1),qRgb(0,255,0));

*/

float cx = j - X0;

float cy = i - Y0;

float x = cx * cos(theta) - cy * sin(theta);

float y = cx * sin(theta) + cy * cos(theta);

x = (x * x) / powf(a,2);

y = (y * y) / powf(b,2);

float result = x + y;

if(abs(result -1)<0.01)

{

inputImage->setPixel(j,i,qRgb(0,255,0));

}

}

}

Show_Image(*inputImage);

/*

*/

ellipse[0] = X0;

ellipse[1] = Y0;

ellipse[2] = a;

ellipse[3] = b;

ellipse[4] = theta;

}

效果图:

误差值:

c++椭圆最小二乘法原理_c++ 椭圆拟合之最小二乘法(图像处理)相关推荐

  1. 非线性最小二乘法 python_[数值计算] 数据拟合——非线性最小二乘法

    前面分析了 线性最小二乘 的解法YcoFlegs:[数值计算] 数据拟合--线性最小二乘法​zhuanlan.zhihu.com 现在来看另一个问题:非线性最小二乘法 1. 定义 首先是如何定义这里这 ...

  2. OpenCV中拟合线性方程(最小二乘法)

    OpenCV中拟合线性方程(最小二乘法) 一.说明 前几篇的文章通过matlab.python.C语言.C++(Eigen库).gsl库(C语言)分别实现了最小二乘法的线性拟合,本篇使用OpenCV实 ...

  3. python多项式拟合_Python 普通最小二乘法(OLS)进行多项式拟合,最小二乘法拟合二次多项式,多元函数拟合。如 电...

    Python 普通最小二乘法(OLS)进行多项式拟合,最小二乘法拟合二次多项式,多元函数拟合.如 电 多元函数拟合.如 电视机和收音机价格多销售额的影响,此时自变量有两个. python 解法:imp ...

  4. c++椭圆最小二乘法原理_利用最小二乘法拟合椭圆方程的理论推导,附有matlab代码...

    为了很好的进行椭圆方程拟合,本文先对椭圆基本知识进行复习,后进行非标准椭圆方程拟合公式推导,最后有matlab代码的实现. 1. 用最小二乘法做椭圆拟合 1.1. 椭圆标准方程 对椭圆印象最深的就是高 ...

  5. 计算机图形学--中点椭圆算法原理及代码实现

    目录 椭圆的几何特性: 算法原理: 代码实现: 说明,我们这里讨论的椭圆都是对称轴平行于坐标轴的椭圆,对于其他方程较为复杂的椭圆我们不做讨论. 椭圆的几何特性: 首先我们考虑椭圆的几何特性.椭圆是抽对 ...

  6. c++ 三次多项式拟合_最小二乘法多项式曲线拟合数学原理及其C++实现

    本文使用 Zhihu On VSCode 创作并发布 0 前言 自动驾驶开发中经常涉及到多项式曲线拟合,本文详细描述了使用最小二乘法进行多项式曲线拟合的数学原理,通过样本集构造范德蒙德矩阵,将一元 N ...

  7. 一般椭圆方程表示的椭圆的绘制

    转载务请说明出处:http://blog.csdn.net/CTeX/   作者CTeX function plotconic(f) %  画椭圆  f是一般椭圆方程 : ax^2+bxy+cy^2+ ...

  8. 三坐标最小二乘法原理_全最小二乘法在三坐标测量中的应用

    第 3O卷第 4期 2008年 O7月 武 汉 工 程 大 学 学 报 J. Wuhan Inst. Tech. Vo1.30 NO.4 Ju1. 2008 文章编号 :1674-2869(2008) ...

  9. 算法#03--详解最小二乘法原理和代码

    最小二乘法原理 最小二乘法的目标:求误差的最小平方和,对应有两种:线性和非线性.线性最小二乘的解是closed-form(如下文),而非线性最小二乘没有closed-form,通常用迭代法求解(如高斯 ...

最新文章

  1. UI培训分享:如何成为一名优秀的UI设计师
  2. jvm诊断与优化(3)
  3. java论文翻译_Java技术(外文文献翻译)
  4. 使用vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
  5. tomcat依赖导入步骤_Tomcat长生不老之术——嵌入式
  6. Air Data System
  7. python bottle框架 运维_python bottle 框架实战教程:任务管理系统 V_1.0版 | linux系统运维...
  8. 计算机二级vb2003年4月考试题,2003年4月全国计算机等级考试二级vb笔试真题附答案...
  9. 卷积神经网络CNN(3)—— FCN(Fully Convolutional Networks)要点解释
  10. 计算机由简单的二进制阴阳,二进制之美,大道至简,二生万物!
  11. 做手好菜,骗个好女孩做女朋友(一)
  12. Innodb独立的undo tablespace
  13. 数学建模——层次分析法
  14. 从论文pdf中复制粘贴文字时,空格变成回车的解决方法
  15. 用c语言求定积分实验报告,C语言用六种方法求定积分.doc
  16. 创建uni-app 微信小程序项目
  17. 我要换博客啦~Github+Hexo~Windows版本
  18. leetcode之随心刷
  19. 以太网卡 及 以太网帧
  20. 编程计算图形的面积(圆形,正方形,长方形)

热门文章

  1. 【kotin】统计字符串中的字母数(拓展函数)
  2. “Table .__efmigrationshistory doesn’t exist”的解决方案
  3. C#LeetCode刷题-树
  4. C#LeetCode刷题之#7-反转整数(Reverse Integer)
  5. 万物皆可爬系列查看翻页翻到最后是什么
  6. AttributeError: 'module' object has no attribute 'version'
  7. 准确实用,7个优秀的开源中文分词库推荐
  8. word之八大文本替换技巧
  9. Uploadify jquery+flash+UploadHandler.ashx .(用)
  10. 漫步最优化二——基本优化问题