基于Python实现椭圆拟合

椭圆拟合 实验目的和要求 尝试使用 cv,fitEllipse()函数,对图像进行椭圆拟合 实验内容和原理 椭圆拟合 该函数使用的是最小二乘法拟合

本文包含相关资料包-----> 点击直达获取<-------

椭圆拟合

实验目的和要求

尝试使用 cv.fitEllipse()函数,对图像进行椭圆拟合

实验内容和原理

椭圆拟合

该函数使用的是最小二乘法拟合,要求输入的点至少有 6 个。

函数中对应的参数如下:

对输入图像的预处理

输入一张 RGB 图片,先转换为灰度图,本来打算先转换为二值图像再进行边缘检测的,但是发现二值化容易使阴影成为新的边缘,并丢失原有边缘信息,于是直接对灰度图进行了边缘检测。在边缘检测前还进行了降噪

边缘检测

用 Sobel Kernel 进行滤波,来计算 x 和 y 方向的导数。

对于每个像素,检测它是否为局部最大值,如果不是就设置为 0

输入的两个参数为 min 和 max,用来限定寻找的边缘范围(大于 max 的肯定是边缘,小于 min 的肯定不是,在 min 和 max 之间的则通过判断连通性等方式来判断。

实验步骤与分析

读入图片

读入后先去掉高频的信息(降噪)。然后保存一个 RGB 图像信息,存储一个 gray 灰度图信息。边缘信息 edge 直接从 gray 中提取,min 取到 100,max 取到 200。

```python FILENAME = "dota2items4.bmp" img = cv.imread(FILENAME) img = cv.GaussianBlur(img, (5, 5), 0) rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB) gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

_, thresh = cv.threshold(gray, 130, 255, cv.THRESH_BINARY + cv.THRESH_OTSU)

edge = cv.Canny(gray, 100, 200) ```

使用 fitEllipse()函数

Ells 数组储存椭圆信息,recs 储存可以旋转的最小矩阵,recs2 储存正矩形信息。Cols 用于储存随机生成的颜色信息,方便区分不同椭圆和矩阵之间的对应关系

```c++ img = rgb edge_ = cv.cvtColor(edge, cv.COLOR_GRAY2RGB) ells = [] recs = [] recs2 = [] cols = [] contours, nothing = cv.findContours(edge, cv.RETR_TREE, cv.CHAIN_APPROX_SIMPLE) for index, contour in enumerate(contours): if contour.shape[0] > 50: ells.append(cv.fitEllipse(contour)) recs2.append(cv.boundingRect(contour)) recs.append(cv.minAreaRect(contour))

random.seed(10) for i in range(len(ells)): cols.append([random.randint(0, 256) for j in range(3)])

```

绘制椭圆与矩形

同时在 RGB 图像和边缘图像中绘制,这是椭圆

c++ for index, ell in enumerate(ells): cv.ellipse(img, ell, cols[index], 2) cv.ellipse(edge_, ell, cols[index], 2)

这是可旋转的矩形

```c++ for index, rec in enumerate(recs): box = cv.boxPoints(rec) # cv2.boxPoints(rect) for OpenCV 3.x box = np.int0(box) cv.drawContours(img,[box],0,cols[index],1) cv.drawContours(edge_,[box],0,cols[index],1)

```

绘制正矩形

```c++ for index, rec2 in enumerate(recs2): x,y,w,h = rec2 cv.rectangle(img,(x,y),(x+w,y+h),cols[index],1) cv.rectangle(edge_,(x,y),(x+w,y+h),cols[index],1)

```

实验结果

输入图像

图里左上角的 Hyper stone 具有很多同心圆信息,右上的 Clarity 有不规则曲线和直线信息,右下的 Tango 有圆形信息且整体外形近似椭圆,正下方的 Force Staff 有近似的圆形信息和直线。

输出:

  • RGB

图像因为进行过高斯滤波而稍微模糊

  • GrayScale

  • Thresh

可以看出,二值化后的图像失去了很多细节信息,同时引入了阴影的边缘信息,这是我们不太想要的

  • Edge

根据灰度图生成了图像的边缘信息

Ellipse on Edge

大部分边缘信息拟合良好,但是图中红色箭头标出的浅蓝色椭圆很奇怪,通过分析,它对应的 contour 是左边浅蓝色矩形内部的信息,并不知道为什么会发生这样的事,也许是 bug?(这个现象同样在 Lena 图片中出现,根据搜索到的信息,可能是最小二乘法造成的问题)

下图为 Lena 照片下半部分,看得出左边深蓝色矩阵和右边的椭圆对应,但并没有任何重合。

Ellipse on RGB

看得出,那个浅蓝色椭圆与整个图片格格不入

心得体会

本来想直接用那种波点图像就算了,看见同学做了对奇怪的游戏 CG 的拟合,于是考虑到继续使用 Lena 姐姐的照片,但是羽毛帽的细节信息太多,导致效果并不十分好。于是找了 DOTA2 的物品图标(虽然效果很好,但是分辨率实在太低,于是找了二次创作的高清图像,效果还不错,各种情况下的效果都能看见)

比如这里非常标准的椭圆

这里对形状近似的物体的拟合

这个粉色应该是在拟合瓶子的左下边缘。

通过调大拟合时使用的点的数量阈值以及画的线的粗细,可以删除一些不靠谱的结果,防止出现一大团乱七八糟的线 的效果(如下)

(对应的其实是)

参考文献

  • 股票在线虚拟交易系统的设计与实现(电子科技大学·苏璇)
  • 基于J2EE的虚拟物流企业信息系统设计(中国农业大学·王福华)
  • 分布式智能网络爬虫的设计与实现(中国科学院大学(工程管理与信息技术学院)·何国正)
  • 基于网络爬虫的计量数据分析系统开发(吉林大学·邹思宇)
  • 校园虚拟地图系统的研究与应用(中国地质大学(北京)·魏传振)
  • 基于Q-learning的系统集成与过程优化(青岛科技大学·魏晓彤)
  • 战时运输任务演练系统设计与实现(大连理工大学·杨福君)
  • 基于J2EE的远程网络教育系统研究与实现(电子科技大学·陈南荪)
  • 校园虚拟地图系统的研究与应用(中国地质大学(北京)·魏传振)
  • 基于SSH架构的个人空间交友网站的设计与实现(北京邮电大学·隋昕航)
  • 基于增量反馈和自适应机制的主题爬虫系统的设计与实现(南京理工大学·王斐)
  • 基于Python的虚拟仪器设计与开发(中央民族大学·郑可富)
  • 轻量级分布式虚假信息爬虫的设计与实现(辽宁大学·韩昱)
  • 销售网站的设计与实现(吉林大学·尹迪)
  • 基于JSF的Web-GIS研究与应用(武汉理工大学·周鼎)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码码头 ,原文地址:https://m.bishedaima.com/yuanma/36131.html

相关推荐

  • 基于SpringBoot框架的教师工作量管理系统

    这是一套采用🔥🔥SpringBoot框架构建的教师工作量管理系统的源代码,主要编程语言为Java,并结合了SpringBoot和Vue技术进行开发,开发工具可选用Idea或Eclipse
    2024年05月23日
    1 1 1
  • 使用 Python 实现的网站变化监测系统

    使用 Python 实现的网站变化监测系统 很多时候我们都有监测某个网站变化的需求,比如是否发布新通知了,是否有新更新了等,之前使用过 Chrome 的几个插件来实现这个功能
    2024年05月14日
    2 1 1
  • 图像压缩之Python

    图像压缩 Image Compression 提供中英文摘要 摘要 [中文]: 主成分分析可以用来减少矩阵(图片)的维度并且将这些新的维度投影行程新的 k 维图像
    2024年05月14日
    1 1 1
  • 基于Java+JSP+Servlet的图书管理系统

    这是一个🔥🔥基于JSP+Servlet的图书管理系统🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 图书管理系统开发技术栈为JSP项目,可以作为毕业设计课程设计作业基于Java+Jsp+Servlet的编写一个图书管理系统
    2024年05月23日
    3 1 1
  • 基于Python实现多项式拟合正弦函数

    1, 实验目的 掌握最小二乘法求解(无惩罚项的损失函数),掌握加惩罚项(2 范数)的损失函数优化,梯度下降法,共轭梯度法,理解过拟合,克服过拟合的方法(如加惩罚项
    2024年05月14日
    2 1 2
  • 数据库原理大作业-web博客

    数据库原理大作业-web博客 开发环境 Windows 10 Ubuntu 16,04 server x64 管理员账号 :admin 密码 :adminpassword 游客账号 :guest 密码123456
    2024年05月14日
    3 1 1
  • B2B平台的医疗病历交互系统

    这是一个🔥🔥基于SpringBoot框架的B2B平台的医疗病历交互系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 设计一个web服务器

    设计一个web服务器 课程设计目的 《Java&,net》是一门实践性较强的软件基础课程,为了学好这门课程,必须在掌握理论知识的同时,加强上机实践,本课程设计的目的就是要达到理论与实际应用相结合
    2024年05月14日
    2 1 1
  • Python+MySQL用户加密存储验证系统

    Python+MySQL用户加密存储验证系统 Python 2,7 IDE Pycharm 5,0,3 PyMySQL 0
    2024年05月14日
    2 1 2
  • 基于Python实现点菜系统

    1, 课程设计目的 《软件设计基础-Python》课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖Python的知识点,又接近工程实际需要
    2024年05月14日
    2 1 1

发表回复

登录后才能评论