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输出当前目录下index.html文件路径的方法
Apr 28 Python
python3 发送任意文件邮件的实例
Jan 23 Python
Python下载网络文本数据到本地内存的四种实现方法示例
Feb 05 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
May 31 Python
浅析python中的迭代与迭代对象
Oct 08 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
Windows系统Python直接调用C++ DLL的方法
Aug 01 Python
pyqt5数据库使用详细教程(打包解决方案)
Mar 25 Python
Python实现自动打开电脑应用的示例代码
Apr 17 Python
python调用API接口实现登陆短信验证
May 10 Python
python中sys模块的介绍与实例
Apr 17 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框架Phpbean说明
2008/01/10 PHP
PHP简单系统查询模块代码打包下载
2008/06/07 PHP
php 远程关机操作的代码
2008/12/05 PHP
如何使用Linux的Crontab定时执行PHP脚本的方法
2011/12/19 PHP
PHP 将逗号、空格、回车分隔的字符串转换为数组的函数
2012/06/07 PHP
用javascript实现画板的代码
2007/09/05 Javascript
javascript prototype,executing,context,closure
2008/12/24 Javascript
Jquery图片延迟加载插件jquery.lazyload.js的使用方法
2014/05/21 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
JS实现页面数据无限加载
2016/09/13 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
jQuery获取this当前对象子元素对象的方法
2016/11/29 Javascript
jQuery html表格排序插件tablesorter使用方法详解
2017/02/10 Javascript
在Js页面通过POST传递参数跳转到新页面详解
2017/08/25 Javascript
详解从react转职到vue开发的项目准备
2019/01/14 Javascript
vue的三种图片引入方式代码实例
2019/11/19 Javascript
[02:28]DOTA2英雄基础教程 灰烬之灵
2013/12/19 DOTA
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
修改Python的pyxmpp2中的主循环使其提高性能
2015/04/24 Python
使用Python操作MySQL的一些基本方法
2015/08/16 Python
Python 制作糗事百科爬虫实例
2016/09/22 Python
Python常用库推荐
2016/12/04 Python
浅谈Python浅拷贝、深拷贝及引用机制
2016/12/15 Python
Python中文分词工具之结巴分词用法实例总结【经典案例】
2017/04/15 Python
python爬取微信公众号文章
2018/08/31 Python
django解决跨域请求的问题详解
2019/01/20 Python
python机器学习包mlxtend的安装和配置详解
2019/08/21 Python
Python 使用 prettytable 库打印表格美化输出功能
2019/12/26 Python
洛杉矶时尚女装系列:J.ING US
2019/03/17 全球购物
简短的公司员工自我评价分享
2013/11/13 职场文书
酒店总经理欢迎词
2014/01/15 职场文书
服装店营销方案
2014/03/10 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
Python requests库参数提交的注意事项总结
2021/03/29 Python
Python循环之while无限迭代
2022/04/30 Python
使用compose函数优化代码提高可读性及扩展性
2022/06/16 Javascript