OpenCV中实现曲线与圆拟合

使用OpenCV做图像处理与分析的时候,经常会遇到需要进行曲线拟合与圆拟合的场景,很多OpenCV开发者对此却是一筹莫展,其实OpenCV中是有现成的函数来实现圆拟合与直线拟合的,而且还会告诉你拟合的圆的半径是多少,简直是超级方便,另外一个常用到的场景就是曲线拟合,常见的是基于多项式拟合,可以根据设定的多项式幂次生成多项式方程,然后根据方程进行一系列的点生成,形成完整的曲线,这个车道线检测,轮廓曲线拟合等场景下特别有用。下面就通过两个简单的例子来分别学习一下曲线拟合与圆拟合的应用。

一:曲线拟合与应用

基于Numpy包的polyfit函数实现,其支持的三个参数分别是x点集合、y点集合,以及多项式的幂次。得到多项式方程以后,就可以完整拟合曲线,图中有如下四个点:

调用polyfit生成的二阶多项式如下:

拟合结果如下:

使用三阶多项式拟合,调用polyfit生成的多项式方程如下:

生成的拟合曲线如下:

使用polyfit进行曲线拟合时候需要注意的是,多项式的幂次最大是数据点数目N - 1幂次多项式,比如有4个点,最多生成3阶多项式拟合。上述演示的完整代码实现如下:

def circle_fitness_demo():
    # 创建图像, 绘制初始点
    image = np.zeros((400, 400, 3), dtype=np.uint8)
    x = np.array([30, 50, 100, 120])
    y = np.array([100, 150, 240, 200])
    for i in range(len(x)):
        cv.circle(image, (x[i], y[i]), 3, (255, 0, 0), -1, 8, 0)
    cv.imwrite("D:/curve.png", image)

    # 多项式曲线生成
    poly = np.poly1d(np.polyfit(x, y, 3))
    print(poly)

    # 绘制拟合曲线
    for t in range(30, 250, 1):
        y_ = np.int(poly(t))
        cv.circle(image, (t, y_), 1, (0, 0, 255), 1, 8, 0)
    cv.imshow("fit curve", image)
    cv.imwrite("D:/fitcurve.png", image)

二:圆拟合与应用

圆的拟合是基于轮廓发现的结果,对发现的近似圆的轮廓,通过圆拟合可以得到比较好的显示效果,轮廓发现与拟合的API分别为findContours与fitEllipse,有图像如下:

使用轮廓发现与圆拟合处理结果如下:

红色表示拟合的圆,蓝色是圆的中心位置

上述完整的演示代码如下:

def circle_fitness_demo():
    src = cv.imread("D:/javaopencv/c2.png")
    cv.imshow("input", src)
    src = cv.GaussianBlur(src, (3, 3), 0)
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
    ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
    cv.imshow("binary", binary)
    # 轮廓发现
    image, contours, hierachy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
    for i in range(len(contours)):
        # 拟合圆或者椭圆,绘制
        rrt = cv.fitEllipse(contours[i])
        cv.ellipse(src, rrt, (0, 0, 255), 2, cv.LINE_AA)
        x, y = rrt[0]
        cv.circle(src, (np.int(x), np.int(y)), 4, (255, 0, 0), -1, 8, 0)
    cv.imshow("fit circle", src)
    cv.imwrite("D:/fitcircle.png", src)

原文发布于微信公众号 - OpenCV学堂(CVSCHOOL)

原文发表时间:2018-06-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

手把手教你用 Keras 实现 LSTM 预测英语单词发音

我近期在研究一个 NLP 项目,根据项目的要求,需要能够通过设计算法和模型处理单词的音节 (Syllables),并对那些没有在词典中出现的单词找到其在词典中对...

892
来自专栏机器之心

教程 | 如何利用散点图矩阵进行数据可视化

2168
来自专栏人工智能

利用神经网络算法的C#手写数字识别

尽管在过去几年已经有许多系统和分类算法被提出,但是手写识别任然是模式识别中的一项挑战。

1.3K11
来自专栏AI研习社

我们分析了最流行的歌词,教你用 RNN 写词编曲(附代码)

翻译 | 余若男 李振 吴章勇 整理 | 凡江 此文展示了基于 RNN 的生成模型在歌词和钢琴音乐上的应用。 介绍 在这篇博文中,我们将在歌词数据...

3334
来自专栏闪电gogogo的专栏

稀疏分解中的MP与OMP算法

MP:matching pursuit匹配追踪 OMP:正交匹配追踪 主要介绍MP与OMP算法的思想与流程,解释为什么需要引入正交?   !!今天发现一个重大问...

5526
来自专栏CreateAMind

神经网络里的信息存储在哪里?如何更好的存储和提取?

神经元的活性和神经元之间的权重都存储了重要信息,有没有更好的存储方式呢?如何向生物记忆学习呢?

882
来自专栏深度学习与数据挖掘实战

【今日热门&优质资源】深度学习经典论文&详解深度学习最热门的RNN网络

1072
来自专栏贾志刚-OpenCV学堂

OpenCV中几何形状识别与测量

OpenCV中几何形状识别与测量 ---- 写有代码的文章、做有情怀的人 ---- 经常看到有学习OpenCV不久的人提问,如何识别一些简单的几何形状与它们的颜...

1.2K12
来自专栏SeanCheney的专栏

《利用Python进行数据分析·第2版》第13章 Python建模库介绍13.1 pandas与模型代码的接口13.2 用Patsy创建模型描述13.3 statsmodels介绍13.4 sciki

本书中,我已经介绍了Python数据分析的编程基础。因为数据分析师和科学家总是在数据规整和准备上花费大量时间,这本书的重点在于掌握这些功能。 开发模型选用什么库...

9156
来自专栏PPV课数据科学社区

数据挖掘系列(6)决策树分类算法

 从这篇开始,我将介绍分类问题,主要介绍决策树算法、朴素贝叶斯、支持向量机、BP神经网络、懒惰学习算法、随机森林与自适应增强算法、分类模型选择和结果评价。总共7...

4494

扫码关注云+社区

领取腾讯云代金券