音效素材网提供各类素材,打造精品素材网站!

站内导航 站长工具 投稿中心 手机访问

音效素材

Python基于opencv的简单图像轮廓形状识别(全网最简单最少代码)
日期:2021-09-08 13:25:14   来源:脚本之家

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

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

一、原数据的展示

在这里插入图片描述

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

在这里插入图片描述

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

二、数据的整合

对于多个文件夹,分析起来很不方便,所有决定将其都放在一个文件夹下进行分析,在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')#以文件夹序号和图片序号为名保存在一个兴建文件夹下

结果如下:

在这里插入图片描述

三、图片轮廓的确定

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)#画出示例图

在这里插入图片描述
进行灰度的转化:

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)##找到边界,第一个参数是二值图像,第二个参数是获取轮廓的方式,
#第三个参数定义轮廓的近似方式

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

在这里插入图片描述

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

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

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

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

得到结果如下:

在这里插入图片描述

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

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依然代表闭合曲线。

在这里插入图片描述

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

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

在这里插入图片描述

四、依据顶点判断形状

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

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值就可以得到颜色。
最终结果如下:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

    您感兴趣的教程

    在docker中安装mysql详解

    本篇文章主要介绍了在docker中安装mysql详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编...

    详解 安装 docker mysql

    win10中文输入法仅在桌面显示怎么办?

    win10中文输入法仅在桌面显示怎么办?

    win10系统使用搜狗,QQ输入法只有在显示桌面的时候才出来,在使用其他程序输入框里面却只能输入字母数字,win10中...

    win10 中文输入法

    一分钟掌握linux系统目录结构

    这篇文章主要介绍了linux系统目录结构,通过结构图和多张表格了解linux系统目录结构,感兴趣的小伙伴们可以参考一...

    结构 目录 系统 linux

    PHP程序员玩转Linux系列 Linux和Windows安装

    这篇文章主要为大家详细介绍了PHP程序员玩转Linux系列文章,Linux和Windows安装nginx教程,具有一定的参考价值,感兴趣...

    玩转 程序员 安装 系列 PHP

    win10怎么安装杜比音效Doby V4.1 win10安装杜

    第四代杜比®家庭影院®技术包含了一整套协同工作的技术,让PC 发出清晰的环绕声同时第四代杜比家庭影院技术...

    win10杜比音效

    纯CSS实现iOS风格打开关闭选择框功能

    这篇文章主要介绍了纯CSS实现iOS风格打开关闭选择框,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作...

    css ios c

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的办法

    Win7如何给C盘扩容 Win7系统电脑C盘扩容的

    Win7给电脑C盘扩容的办法大家知道吗?当系统分区C盘空间不足时,就需要给它扩容了,如果不管,C盘没有足够的空间...

    Win7 C盘 扩容

    百度推广竞品词的投放策略

    SEM是基于关键词搜索的营销活动。作为推广人员,我们所做的工作,就是打理成千上万的关键词,关注它们的质量度...

    百度推广 竞品词

    Visual Studio Code(vscode) git的使用教程

    这篇文章主要介绍了详解Visual Studio Code(vscode) git的使用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。...

    教程 Studio Visual Code git

    七牛云储存创始人分享七牛的创立故事与

    这篇文章主要介绍了七牛云储存创始人分享七牛的创立故事与对Go语言的应用,七牛选用Go语言这门新兴的编程语言进行...

    七牛 Go语言

    Win10预览版Mobile 10547即将发布 9月19日上午

    微软副总裁Gabriel Aul的Twitter透露了 Win10 Mobile预览版10536即将发布,他表示该版本已进入内部慢速版阶段,发布时间目...

    Win10 预览版

    HTML标签meta总结,HTML5 head meta 属性整理

    移动前端开发中添加一些webkit专属的HTML5头部标签,帮助浏览器更好解析HTML代码,更好地将移动web前端页面表现出来...

    移动端html5模拟长按事件的实现方法

    这篇文章主要介绍了移动端html5模拟长按事件的实现方法的相关资料,小编觉得挺不错的,现在分享给大家,也给大家...

    移动端 html5 长按

    HTML常用meta大全(推荐)

    这篇文章主要介绍了HTML常用meta大全(推荐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    cdr怎么把图片转换成位图? cdr图片转换为位图的教程

    cdr怎么把图片转换成位图? cdr图片转换为

    cdr怎么把图片转换成位图?cdr中插入的图片想要转换成位图,该怎么转换呢?下面我们就来看看cdr图片转换为位图的...

    cdr 图片 位图

    win10系统怎么录屏?win10系统自带录屏详细教程

    win10系统怎么录屏?win10系统自带录屏详细

    当我们是使用win10系统的时候,想要录制电脑上的画面,这时候有人会想到下个第三方软件,其实可以用电脑上的自带...

    win10 系统自带录屏 详细教程

    + 更多教程 +
    ASP编程JSP编程PHP编程.NET编程python编程