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基础入门详解(文件输入/输出 内建类型 字典操作使用方法)
Dec 08 Python
python文件操作相关知识点总结整理
Feb 22 Python
Python基于回溯法解决01背包问题实例
Dec 06 Python
Python cookbook(数据结构与算法)在字典中将键映射到多个值上的方法
Feb 18 Python
python 对dataframe下面的值进行大规模赋值方法
Jun 09 Python
基于scrapy的redis安装和配置方法
Jun 13 Python
Python微信操控itchat的方法
May 31 Python
python 判断字符串中是否含有汉字或非汉字的实例
Jul 15 Python
Windows下实现将Pascal VOC转化为TFRecords
Feb 17 Python
python读取当前目录下的CSV文件数据
Mar 11 Python
Pycharm IDE的安装和使用教程详解
Apr 30 Python
Django 解决阿里云部署同步数据库报错的问题
May 14 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
Discuz 模板引擎的封装类代码
2008/07/18 PHP
PHP与MYSQL中UTF8 中文排序示例代码
2014/10/23 PHP
jquery validator 插件增加日期比较方法
2010/02/21 Javascript
jQuery Tools tab(幻灯片)
2012/07/14 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
Chrome扩展页面动态绑定JS事件提示错误
2014/02/11 Javascript
javascript每日必学之循环
2016/02/19 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
Node.js下自定义错误类型详解
2016/10/17 Javascript
Angular5.0 子组件通过service传递值给父组件的方法
2018/07/13 Javascript
vue权限管理系统的实现代码
2019/01/17 Javascript
nodejs实现用户登录路由功能
2019/05/22 NodeJs
详解vue 2.6 中 slot 的新用法
2019/07/09 Javascript
vue使用vant中的checkbox实现全选功能
2020/11/17 Vue.js
[50:27]OG vs LGD 2018国际邀请赛淘汰赛BO3 第一场 8.26
2018/08/30 DOTA
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
Ruby使用eventmachine为HTTP服务器添加文件下载功能
2016/04/20 Python
儿童python练习实例
2018/05/27 Python
python 自动去除空行的实例
2018/07/24 Python
django使用LDAP验证的方法示例
2018/12/10 Python
spark dataframe 将一列展开,把该列所有值都变成新列的方法
2019/01/29 Python
浅谈python 中类属性共享的问题
2019/07/02 Python
python与C、C++混编的四种方式(小结)
2019/07/15 Python
django 控制页面跳转的例子
2019/08/06 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
使用python+whoosh实现全文检索
2019/12/09 Python
Win10里python3创建虚拟环境的步骤
2020/01/31 Python
python怎么自定义捕获错误
2020/06/29 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
印度领先的眼镜电子商务网站:Lenskart
2019/12/16 全球购物
应届生会计求职信
2013/11/11 职场文书
2014爱耳日宣传教育活动总结
2014/03/09 职场文书
给校长的建议书300字
2014/05/16 职场文书
演讲稿的格式及范文
2014/08/22 职场文书
安全生产协议书
2016/03/22 职场文书
Python 图片添加美颜效果
2022/04/28 Python