c++椭圆最小二乘法原理_c++ 椭圆拟合之最小二乘法(图像处理)
椭圆拟合之最小二乘法
原理:可能以后的篇幅再详细写了,
代码:
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++ 椭圆拟合之最小二乘法(图像处理)相关推荐
- 非线性最小二乘法 python_[数值计算] 数据拟合——非线性最小二乘法
前面分析了 线性最小二乘 的解法YcoFlegs:[数值计算] 数据拟合--线性最小二乘法zhuanlan.zhihu.com 现在来看另一个问题:非线性最小二乘法 1. 定义 首先是如何定义这里这 ...
- OpenCV中拟合线性方程(最小二乘法)
OpenCV中拟合线性方程(最小二乘法) 一.说明 前几篇的文章通过matlab.python.C语言.C++(Eigen库).gsl库(C语言)分别实现了最小二乘法的线性拟合,本篇使用OpenCV实 ...
- python多项式拟合_Python 普通最小二乘法(OLS)进行多项式拟合,最小二乘法拟合二次多项式,多元函数拟合。如 电...
Python 普通最小二乘法(OLS)进行多项式拟合,最小二乘法拟合二次多项式,多元函数拟合.如 电 多元函数拟合.如 电视机和收音机价格多销售额的影响,此时自变量有两个. python 解法:imp ...
- c++椭圆最小二乘法原理_利用最小二乘法拟合椭圆方程的理论推导,附有matlab代码...
为了很好的进行椭圆方程拟合,本文先对椭圆基本知识进行复习,后进行非标准椭圆方程拟合公式推导,最后有matlab代码的实现. 1. 用最小二乘法做椭圆拟合 1.1. 椭圆标准方程 对椭圆印象最深的就是高 ...
- 计算机图形学--中点椭圆算法原理及代码实现
目录 椭圆的几何特性: 算法原理: 代码实现: 说明,我们这里讨论的椭圆都是对称轴平行于坐标轴的椭圆,对于其他方程较为复杂的椭圆我们不做讨论. 椭圆的几何特性: 首先我们考虑椭圆的几何特性.椭圆是抽对 ...
- c++ 三次多项式拟合_最小二乘法多项式曲线拟合数学原理及其C++实现
本文使用 Zhihu On VSCode 创作并发布 0 前言 自动驾驶开发中经常涉及到多项式曲线拟合,本文详细描述了使用最小二乘法进行多项式曲线拟合的数学原理,通过样本集构造范德蒙德矩阵,将一元 N ...
- 一般椭圆方程表示的椭圆的绘制
转载务请说明出处:http://blog.csdn.net/CTeX/ 作者CTeX function plotconic(f) % 画椭圆 f是一般椭圆方程 : ax^2+bxy+cy^2+ ...
- 三坐标最小二乘法原理_全最小二乘法在三坐标测量中的应用
第 3O卷第 4期 2008年 O7月 武 汉 工 程 大 学 学 报 J. Wuhan Inst. Tech. Vo1.30 NO.4 Ju1. 2008 文章编号 :1674-2869(2008) ...
- 算法#03--详解最小二乘法原理和代码
最小二乘法原理 最小二乘法的目标:求误差的最小平方和,对应有两种:线性和非线性.线性最小二乘的解是closed-form(如下文),而非线性最小二乘没有closed-form,通常用迭代法求解(如高斯 ...
最新文章
- UI培训分享:如何成为一名优秀的UI设计师
- jvm诊断与优化(3)
- java论文翻译_Java技术(外文文献翻译)
- 使用vue-router懒加载解决首次加载时资源过多导致的速度缓慢问题
- tomcat依赖导入步骤_Tomcat长生不老之术——嵌入式
- Air Data System
- python bottle框架 运维_python bottle 框架实战教程:任务管理系统 V_1.0版 | linux系统运维...
- 计算机二级vb2003年4月考试题,2003年4月全国计算机等级考试二级vb笔试真题附答案...
- 卷积神经网络CNN(3)—— FCN(Fully Convolutional Networks)要点解释
- 计算机由简单的二进制阴阳,二进制之美,大道至简,二生万物!
- 做手好菜,骗个好女孩做女朋友(一)
- Innodb独立的undo tablespace
- 数学建模——层次分析法
- 从论文pdf中复制粘贴文字时,空格变成回车的解决方法
- 用c语言求定积分实验报告,C语言用六种方法求定积分.doc
- 创建uni-app 微信小程序项目
- 我要换博客啦~Github+Hexo~Windows版本
- leetcode之随心刷
- 以太网卡 及 以太网帧
- 编程计算图形的面积(圆形,正方形,长方形)
热门文章
- 【kotin】统计字符串中的字母数(拓展函数)
- “Table .__efmigrationshistory doesn’t exist”的解决方案
- C#LeetCode刷题-树
- C#LeetCode刷题之#7-反转整数(Reverse Integer)
- 万物皆可爬系列查看翻页翻到最后是什么
- AttributeError: 'module' object has no attribute 'version'
- 准确实用,7个优秀的开源中文分词库推荐
- word之八大文本替换技巧
- Uploadify jquery+flash+UploadHandler.ashx .(用)
- 漫步最优化二——基本优化问题