Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)


Posted in Python onJanuary 28, 2021

可以直接跳到最后整体代码看一看是不是很少的代码!!!!

思路:
1. 数据的整合
2. 图片的灰度转化
3. 图片的二值转化
4. 图片的轮廓识别
5. 得到图片的顶点数
6. 依据顶点数判断图像形状

一、原数据的展示

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

图片文件共36个文件夹,每个文件夹有100张图片,共3600张图片。

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

每一个文件夹里都有形同此类的图形

二、数据的整合

对于多个文件夹,分析起来很不方便,所有决定将其都放在一个文件夹下进行分析,在python中具体实现如下:
本次需要的包

import cv2
import os
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
a=os.listdir('C:\\Users\\dell\\Desktop\\OpenCVProofSet')#循环读取每个子文件夹
for i in range(len(a)):
 	b=os.listdir('C:\\Users\\dell\\Desktop\\OpenCVProofSet\\'+a[i])#读取每个子文件下的图片文件
 for j in range(len(b)):
  c=Image.open('C:\\Users\\dell\\Desktop\\OpenCVProofSet\\'+a[i]+'\\'+b[j])#循环读取每个图片文件
  c.save('C:\\Users\\dell\\Desktop\\cleardata\\'+str(i)+'_'+str(j)+'.png')#以文件夹序号和图片序号为名保存在一个兴建文件夹下

结果如下:

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

三、图片轮廓的确定

3.1图片的灰度处理

以下以一张图片为例子作为说明
对于灰度的处理,选择使用opencv的cv2.cvtColor函数,代码示例如下:

d=os.listdir('C:\\Users\\dell\\Desktop\\cleardata\\')#文件路径
e=cv2.imread('C:\\Users\\dell\\Desktop\\cleardata\\'+d[5])#以矩阵的形式图片读入
plt.imshow(e)#画出示例图

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
进行灰度的转化:

g=cv2.cvtColor(e,cv2.COLOR_BGR2GRAY)##灰度转化

3.2图片的二值转化

对于图片的二值转化这里选用cv2.threshold函数,代码示例如下:

r,b=cv2.threshold(g,0,255,cv2.THRESH_OTSU)#二值转化,大于0的像素统一设置为255,小于等于0的统一设置为0

上述代码的第一个参数为灰度图形,第二个参数是阈值,即大于0的像素点转化为255,然后选用的THRESH_OTSU方法,具体说明如下:
通常情况,我们一般不知道设定怎样的阈值thresh才能得到比较好的二值化效果,只能去试。如对于一幅双峰图像(理解为图像直方图中存在两个峰),我们指定的阈值应尽量在两个峰之间的峰谷。这时,就可以用第四个参数THRESH_OTSU,它对一幅双峰图像自动根据其直方图计算出合适的阈值(对于非双峰图,这种方法得到的结果可能不理想)。
对于双峰图,我们需要多传入一个参数cv2.THRESH_OTSU,并且把阈值thresh设为0,算法会找到最优阈值,并作为第一个返回值ret返回。

其中会返回两个值,第二个值就是二值化后的图形矩阵。

3.3轮廓的寻找

在轮廓的寻找方面,采用cv2.findContours方式。代码示例如下:

cr,t=cv2.findContours(b, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)##找到边界,第一个参数是二值图像,第二个参数是获取轮廓的方式,
#第三个参数定义轮廓的近似方式

上述函数里的参数中,第一个参数是二值化后的矩阵,第二个参数是获取轮廓的方式,第三个参数是定义轮廓的近似方式。后面两个参数的具体解释如下:

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

上面得到的结果中第一个结果是轮廓点的集合。

画出边界轮廓,运用函数是cv2.drawContours,代码示例如下:

plt.imshow(cv2.drawContours(e,cr,-1,50))#画出边界,可以看出有坐标轴和五角星两个边界,第一个参数是原图,第二个参数是边界,
#第三个参数代表画出所有边界,第四个参数是线的粗细

上述函数中第一个参数是原始图形,第二个参数是得到的轮廓点的集合,第三个参数是代表画出所有轮廓点,第四个参数是线的粗细。

得到结果如下:

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

可以发现,坐标轴的轮廓和五角星的轮廓都被画了出来。

3.4轮廓的逼近,得到顶点

在得到轮廓点后,需要得到轮廓的顶点,通过顶点得到具体什么图形,在轮廓逼近中用到两个函数:cv2.arcLength,cv2.approxPolyDP,代码示例如下:

ep = 0.01*cv2.arcLength(cr[1], True)#五角星轮廓的周长cr[0]是坐标轴的周长,然后将其缩小,作为下一步的阈值
ap = cv2.approxPolyDP(cr[1], ep, True)#轮廓的转折点的近似点

cv2.arcLength得到的是轮廓点形成的曲线围成的图形的周长,cr[1]代表里层五角星的轮廓点,因为cr里有两个轮廓集合,一个是外层的坐标轴的轮廓点集合,一个是里层五角星的轮廓点集合。True代表闭合的曲线。将其取1%作为下一个函数的阈值。

cv2.approxPolyDP将其得到的轮廓点进行筛选(按设定的阈值与其真实的线进行比较),其筛选的标准就是上一个函数得到的1%的周长,大于这个值的点舍去,小于这个值的点保留,True依然代表闭合曲线。

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

通过以上的步骤就可以保留一些点,而这些点就是得到顶点(这点需要读者去想一想,为什么以1%周长为阈值得到的点就是顶点,作者认为是两条线的拐点相对于来说是里真实线最近的点)
顶点数:

len(ap)#可以看见五角星有10个点

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

四、依据顶点判断形状

根据得到的定点数就可判断出形状了,三个顶点就是三角形,四个就是矩形,十个就是五角星,十个以上就是圆形了;上述的完整代码如下:

import cv2
import os
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
d=os.listdir('C:\\Users\\dell\\Desktop\\cleardata\\')
for i in range(len(d)):
 e=cv2.imread('C:\\Users\\dell\\Desktop\\cleardata\\'+d[i])
 g=cv2.cvtColor(e,cv2.COLOR_BGR2GRAY)
 r,b=cv2.threshold(g,0,255,cv2.THRESH_OTSU)
 cr,t=cv2.findContours(b, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
 ep = 0.01*cv2.arcLength(cr[1], True)
 ap = cv2.approxPolyDP(cr[1], ep, True)
 co=len(ap)
 if co==3:
  st='三角形'
 elif co==4:
  st='矩形'
 elif co==10:
  st='五角星'
 else:
  st='圆'  
 plt.imsave('C:\\Users\\dell\\Desktop\\形状\\'+st+str(e[100][100])+str(i)+'.jpg',e)#取图像中间的点的RGB作为颜色代表

这里我还取了图形的中点,希望得到图片的颜色,其得到的是RGB值,通过RGB值就可以得到颜色。
最终结果如下:

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)

到此这篇关于基于opencv的简单图像轮廓形状识别(全网最简单最少代码)的文章就介绍到这了,更多相关opencv 图像轮廓形状识别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python轻松查到删除自己的微信好友
Jan 10 Python
python随机取list中的元素方法
Apr 08 Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 Python
python使用Matplotlib画条形图
Mar 25 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
Python图像处理PIL各模块详细介绍(推荐)
Jul 17 Python
Python操作qml对象过程详解
Sep 26 Python
pytorch实现CNN卷积神经网络
Feb 19 Python
python图形界面开发之wxPython树控件使用方法详解
Feb 24 Python
Python读取配置文件(config.ini)以及写入配置文件
Apr 08 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
Python中全局变量和局部变量的理解与区别
Feb 07 Python
python如何构建mock接口服务
Jan 28 #Python
pytest fixtures装饰器的使用和如何控制用例的执行顺序
Jan 28 #Python
如何用tempfile库创建python进程中的临时文件
Jan 28 #Python
python基于Kivy写一个图形桌面时钟程序
Jan 28 #Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 #Python
详解Python调用系统命令的六种方法
Jan 28 #Python
教你一分钟在win10终端成功安装Pytorch的方法步骤
Jan 28 #Python
You might like
PHP无限分类代码,支持数组格式化、直接输出菜单两种方式
2011/05/18 PHP
zend framework框架中url大小写问题解决方法
2014/08/19 PHP
JavaScript While 循环基础教程
2007/04/05 Javascript
JQuery 浮动导航栏实现代码
2009/08/27 Javascript
javascript当onmousedown、onmouseup、onclick同时应用于同一个标签节点Element
2010/01/05 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
javascript获取文档坐标和视口坐标
2015/05/26 Javascript
Jquery实现瀑布流布局(备有详细注释)
2015/07/31 Javascript
学习JavaScript事件流和事件处理程序
2016/01/25 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
js,jq,css多方面实现简易下拉菜单功能
2017/05/13 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
微信小程序项目总结之点赞 删除列表 分享功能
2018/06/25 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
微信小程序云开发如何使用npm安装依赖
2019/05/18 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
python使用7z解压apk包的方法
2015/04/18 Python
Python验证码识别的方法
2015/07/10 Python
python编程实现归并排序
2017/04/14 Python
Windows下Python3.6安装第三方模块的方法
2018/11/22 Python
在Pycharm中将pyinstaller加入External Tools的方法
2019/01/16 Python
python爬虫 urllib模块url编码处理详解
2019/08/20 Python
利用Python实现学生信息管理系统的完整实例
2020/12/30 Python
台湾线上百货零售购物平台:friDay购物
2017/08/18 全球购物
印度低票价航空公司:GoAir
2017/10/11 全球购物
中专三年学习的个人自我评价
2013/12/12 职场文书
园林资料员岗位职责
2013/12/30 职场文书
师德建设实施方案
2014/03/21 职场文书
报到证办理个人委托书
2014/10/06 职场文书
党支部群众路线整改措施思想汇报
2014/10/10 职场文书
2016孝老爱亲模范事迹材料
2016/02/26 职场文书
导游词之无锡唐城
2019/12/12 职场文书
SQL Server查询某个字段在哪些表中存在
2022/03/03 SQL Server
mysql 体系结构和存储引擎介绍
2022/05/06 MySQL
使用CSS自定义属性实现骨架屏效果
2022/06/21 HTML / CSS