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 30 Python
100行Python代码实现自动抢火车票(附源码)
Jan 11 Python
Sanic框架基于类的视图用法示例
Jul 18 Python
Python正则匹配判断手机号是否合法的方法
Dec 09 Python
Python之NumPy(axis=0 与axis=1)区分详解
May 27 Python
python tkinter窗口最大化的实现
Jul 15 Python
Python产生一个数值范围内的不重复的随机数的实现方法
Aug 21 Python
python opencv调用笔记本摄像头
Aug 28 Python
基于Python+Appium实现京东双十一自动领金币功能
Oct 31 Python
Python 实现递归法解决迷宫问题的示例代码
Jan 12 Python
Python之变量类型和if判断方式
May 05 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 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+Ajax异步通讯实现用户名邮箱验证是否已注册( 2种方法实现)
2011/12/28 PHP
php登录超时检测功能实例详解
2017/03/21 PHP
PHP中file_put_contents追加和换行的实现方法
2017/04/01 PHP
详解PHP神奇又有用的Trait
2019/03/25 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
window.open不被拦截的实现代码
2012/08/22 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
jQuery中的height innerHeight outerHeight区别示例介绍
2014/06/15 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
JS+CSS实现鼠标经过弹出一个DIV框完整实例(带缓冲动画渐变效果)
2016/03/25 Javascript
玩转NODE.JS(四)-搭建简单的聊天室的代码
2016/11/11 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
解决Vue页面固定滚动位置的处理办法
2017/07/13 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
详解NODEJS的http实现
2018/01/04 NodeJs
Bootstrap 模态框自定义点击和关闭事件详解
2018/08/10 Javascript
jQuery使用hide()、toggle()函数实现相机品牌展示隐藏功能
2021/01/29 jQuery
[02:10]三分钟回顾完美世界城市挑战赛
2019/01/24 DOTA
python解析xml文件实例分析
2015/05/27 Python
python实现list元素按关键字相加减的方法示例
2017/06/09 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
Python更新数据库脚本两种方法及对比介绍
2017/07/27 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
Java与Python两大幸存者谁更胜一筹呢
2018/04/12 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
20行代码教你用python给证件照换底色的方法示例
2021/02/05 Python
eDreams澳大利亚:预订机票、酒店和度假产品
2017/04/19 全球购物
瑞士隐形眼镜和护理产品网上商店:Linsenklick
2019/10/21 全球购物
大学生会计职业生涯规划范文
2014/02/28 职场文书
新文化运动的口号
2014/06/21 职场文书
中秋节国旗下演讲稿
2014/09/05 职场文书
仓库管理制度范本
2015/08/04 职场文书
Go语言空白表示符_的实例用法
2021/07/04 Golang
golang fmt格式“占位符”的实例用法详解
2021/07/04 Golang
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android