+72的原9的源码怎么算算

建议收藏,告别碎片阅读!

本玳码构建线性函数和多项式函数并绘图然后在用SkLearn的线性回归(LinearRegression)模块和多项式回归(PolynomialFeatures)模块拟合上述两种曲线。

构建线性函数和多项式函数

h(x)=0.3?0.05?x,並在线性函数上添加随机值;构造多项式函数

  • 对于线性数据集线性拟合函数的MSE为0.00069
  • 多余多项式数据集,线性拟合函数的MSE为6.40752

使用SkLearn的LinearRegression模块拟合曲线可以使用sklearn.metrics.mean_squared_error 评估误差。从结果可见多项式函数可以拟合线性函数,但是出现过拟合现象多项式函数拟合多项式函数最佳,但是也需要多项式的阶数用高阶多项式函数拟合低阶多项式函数也会出现过拟合现象。

  • 对于线性数据集多项式拟合函数的MSE为0.00055
  • 多余多项式数据集,多项式拟合函数的MSE为0.61483
  • [3] 佩德罗·多明戈斯. 终极算法-机器学习和人工智能如何重塑世界. 中信出版社. 2018.

标准霍夫变换本质上是把图像映射到它的参数空间上它需要计算所有的M个边缘点,这样它的运算量和所需内存空间都会很大如果在输入图像中只是处理mm<M)个边缘点,则这m个边缘点的选取是具有一定概率性的因此该方法被称为概率霍夫变换(Probabilistic Hough Transform)。该方法还有一个重要的特点就是能够检测出线端即能够检测出图像中直线的两个端点,确切地定位图像中的直线

HoughLinesP函数就是利用概率霍夫变换来检测直线的。它的一般步骤为:

1、随机抽取圖像中的一个特征点即边缘点,如果该点已经被标定为是某一条直线上的点则继续在剩下的边缘点中随机抽取一个边缘点,直到所有邊缘点都抽取完了为止;

2、对该点进行霍夫变换并进行累加和计算;

3、选取在霍夫空间内值最大的点,如果该点大于阈值的则进行步驟4,否则回到步骤1;

4、根据霍夫变换得到的最大值从该点出发,沿着直线的方向位移从而找到直线的两个端点;

5、计算直线的长度,洳果大于某个阈值则被认为是好的直线输出,回到步骤1

image为输入图像,要求是8位单通道图像

lines为输出的直线向量每条线用4个元素表示,即直线的两个端点的4个坐标值

rho和theta分别为距离和角度的分辨率

threshold为阈值即步骤3中的阈值

minLineLength为最小直线长度,在步骤5中要用到即如果小于该值,则不被认为是一条直线

maxLineGap为最大直线间隙在步骤4中要用到,即如果有两条线段是在一条直线上但它们之间因为有间隙,所以被认为是兩个线段如果这个间隙大于该值,则被认为是两条线段否则是一条。

//accum为累加器矩阵mask为掩码矩阵 //用于存储特征点坐标,即边缘像素的位置 //确保输入图像的正确性 //由角度和距离分辨率得到角度和距离的离散数量 //创建累加器矩阵,即霍夫空间 //创建掩码矩阵大小与输入图潒相同 //定义trigtab的大小,因为要存储正弦和余弦值所以长度为角度离散数的2倍 //避免重复计算,事先计算好所需的所有正弦和余弦值 //收集图像Φ的所有非零点因为输入图像是边缘图像,所以非零点就是边缘点 //提取出输入图像和掩码矩阵的每行地址指针 //终止写序列seq为所有边缘點坐标位置的序列 //随机处理所有的边缘点 //步骤1,在剩下的边缘点中随机选择一个点idx为不大于count的随机数 //max_val为累加器的最大值,max_n为最大值所对應的角度 //由随机数idx在序列中提取出所对应的坐标点 //定义直线的两个端点 //累加器的地址指针也就是霍夫空间的地址指针 //提取出坐标点的横、纵坐标 //用序列中的最后一个元素覆盖掉刚才提取出来的随机坐标点 //检测这个坐标点是否已经计算过,也就是它已经属于其他直线 //因为计算过的坐标点会在掩码矩阵mask的相对应位置清零 //步骤2更新累加器矩阵,找到最有可能的直线 //在累加器矩阵的相应位置上数值加1并赋值给val //哽新最大值,并得到它的角度 //步骤3如果上面得到的最大值小于阈值,则放弃该点继续下一个点的计算 //步骤4,从当前点出发沿着它所茬直线的方向前进,直到达到端点为止 //当前点的横、纵坐标值 //确定当前点所在直线的角度是在45度~135度之间还是在0~45或135度~180度之间 xflag = 1; //置标识位,标识直线的粗略方向 //确定横、纵坐标的位移量 //确定横、纵坐标的位移量 //搜索直线的两个端点 //gap表示两条直线的间隙x和y为搜索位置,dx和dy為位移量 //搜索第二个端点的时候反方向位移 //沿着直线的方向位移,直到到达图像的边界或大的间隙为止 //确定新的位移后的坐标位置 //如果箌达了图像的边界停止位移,退出循环 //定位位移后掩码矩阵位置 //该掩码不为0说明该点可能是在直线上 //更新直线的端点位置 //掩码为0,说奣不是直线但仍继续位移,直到间隙大于所设置的阈值为止 //步骤5由检测到的直线的两个端点粗略计算直线的长度 //当直线长度大于所设置的阈值时,good_line为1否则为0 //再次搜索端点,目的是更新累加器矩阵和更新掩码矩阵以备下一次循环使用 //if语句的作用是清除那些已经判定是恏的直线上的点对应的累加器的值,避免再次利用这些累加值 //得到累加器矩阵地址指针 //搜索过的位置不管是好的直线,还是坏的直线掩码相应位置都清0,这样下次就不会再重复搜索这些位置了从而达到减小计算边缘点的目的 //如果已经到达了直线的端点,则退出循环 //把兩个端点压入序列中 //如果检测到的直线数量大于阈值则退出该函数

下面就给出应用HoughLinesP函数检测直线段的应用程序:


我要回帖

更多关于 9的源码怎么算 的文章

 

随机推荐