图形形状及颜色识别

  • 一、题目要求
  • 二、系统功能
    • 2.1 系统描述
    • 2.2 具体功能
  • 三、主要流程设计
  • 四、核心算法流程图
  • 五、使用手册
  • 六、核心功能源代码
    • 5.1颜色判断
    • 5.2图像处理
    • 5.3主程序
  • 附件:源码

一、题目要求

二、系统功能

2.1 系统描述

对给定的图像文件,识别其中的规则图形和图形所填充的颜色。在原图上进行标记并显示出来。

2.2 具体功能

可以识别的规则图形:圆形、三角形、矩形、正方形、菱形、其他四边形、五角星、其他多边形。
可以识别的颜色:黑色、灰色、白色、粉色、红色、橙色、黄色、绿色、青色、蓝色、紫色。
标记图形:使用矩形框将识别到的规则图形框出,并在框附近显示标签(形状和颜色)。

三、主要流程设计


1.程序开始时用户输入需要被识别图片的绝对路径,然后读取图片。
2.若读取失败则让用户重新输入。
3.对图片里的所有图形进行识别。遍历图片中识别到的每一个图形并判断其形状和填充颜色。
4.在图片上打上对应的标签并显示。
5.程序结束。

四、核心算法流程图

五、使用手册

图像放于英文路径下,例:D:\test.png。
运行python程序,即可显示原图像和识别处理后的图像。
效果:

六、核心功能源代码

5.1颜色判断

1.   def findColor(imgcut):
2.      img_hsv=cv2.cvtColor(imgcut,cv2.COLOR_BGR2HSV)
3.      color_dict=ColorList()
4.      color_most=0
5.      color_now=None
6.      for color in color_dict:
7.          #二值化 和颜色字典比较 在上下限之间的像素变为255,之外的所有像素变为0
8.          color_cmp=cv2.inRange(img_hsv,color_dict[color][0],color_dict[color][1])
9.          #膨胀 使颜色分割成块并更突出
10.         color_boom = cv2.dilate(color_cmp,None,iterations=1)
11.         #取出每一小块
12.         contours,hierarchy=cv2.findContours(color_boom.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
13.         color_area=0
14.         for img in contours:
15.             color_area+=cv2.contourArea(img)
16.         if(color_area>color_most):
17.             color_most=color_area
18.             color_now=color
19.     return color_now 

5.2图像处理

1.   def LastButNotLeast(imginit,imgcopy):
2.      # 灰度化
3.      img_Gray = cv2.cvtColor(imginit, cv2.COLOR_BGR2GRAY)
4.      # 高斯平滑
5.      img_Blur = cv2.GaussianBlur(img_Gray, (3, 3), 1)
6.      # 边缘检测
7.      img_Canny = cv2.Canny(img_Blur, 50, 50)
8.      #得到图片中所有图形的轮廓
9.      #findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
10.     contours,hierarchy=cv2.findContours(img_Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)
11.     #参数:输入图像,霍夫梯度法,分辨率,最小距离,检测方法的对应的参数*2,半径
12.     for img in contours:
13.         #计算面积 太小就不算了
14.         area=cv2.contourArea(img)
15.         if area>80:
16.             perimeter=cv2.arcLength(img,True)
17.             #折线化
18.             side=cv2.approxPolyDP(img,0.01*perimeter,True)
19.             #print(side)
20.             #计算有几条线
21.             sideNum=len(side)
22.             #print(sideNum)
23.             #计算边长
24.             length=[]
25.             k=[]
26.             for i in range(0,sideNum):
27.                 if(i+1<sideNum):
28.                     l=((side[i][0][0]-side[i+1][0][0])**2+(side[i][0][1]-side[i+1][0][1])**2)**(1/2)
29.                     ktemp=k_count(side[i][0][0],side[i][0][1],side[i+1][0][0],side[i+1][0][1])
30.                 else:
31.                     l=((side[i][0][0]-side[0][0][0])**2+(side[i][0][1]-side[0][0][1])**2)**(1/2)
32.                     ktemp=k_count(side[i][0][0],side[i][0][1],side[0][0][0],side[0][0][1])
33.                 length.append(l)
34.                 k.append(ktemp)
35.             #print(length)
36.             #计算角度
37.             angle=[]
38.             for i in range(0,sideNum):
39.                 if(i+1<sideNum):
40.                     ang=angle_count(k[i],k[i+1])
41.                 else:
42.                     ang=angle_count(k[i],k[0])
43.                 angle.append(ang)
44.             #print(angle)
45.             #形状判断
46.             #三角形
47.             if sideNum==3:
48.                 tag="triangle"
49.             #其他四边形
50.             elif sideNum==4:
51.                 tag="Other quadrilateral"
52.                 flag=0
53.                 #菱形
54.                 err=5
55.                 if(length[1]-err<=length[0]<=length[1]+err):
56.                     if(length[2]-err<=length[1]<=length[2]+err):
57.                         if(length[3]-err<=length[2]<=length[3]+err):
58.                             if(length[0]-err<=length[3]<=length[0]+err):
59.                                 tag="diamond"
60.                                 flag=1
61.                 #矩形
62.                 if(89<angle[0]<91):
63.                     if(89<angle[1]<91):
64.                         if(89<angle[2]<91):
65.                             if(89<angle[3]<91):
66.                                 tag="rectangular"
67.                                 if(flag==1):
68.                                     tag="square"
69.             elif sideNum==5:
70.                 tag="pentagon"
71.             elif sideNum==6:
72.                 tag="hexagon"
73.             elif sideNum==10:
74.                 tag="five-pointed star"
75.             elif sideNum>10:
76.                 tag="circle"
77.             else:
78.                 tag="None"
79.             #定个位
80.             x,y,wide,high=cv2.boundingRect(side)
81.             #裁剪中心位置
82.             x0=int(x+(wide/2))
83.             y0=int(y+(high/2))
84.             err=25
85.             imgCut=imginit[(y0-err):(y0+err),(x0-err):(x0+err)]
86.             color=findColor(imgCut)
87.             #添加标签
88.             cv2.rectangle(imgcopy, (x-5, y-5), (x + wide+5, y + high+5), (0, 235, 6), 2)
89.             cv2.putText(imgcopy, tag,(x, y-28), cv2.FONT_HERSHEY_TRIPLEX, 0.85,(0,0, 255), 1)
90.             cv2.putText(imgcopy, color,(x, y-5), cv2.FONT_HERSHEY_TRIPLEX, 0.85,(0, 0, 255), 1)  

5.3主程序

1.   if __name__ == "__main__":
2.      path=input("图片路径:")
3.      #path=r"D:\test.png"
4.      img = cv2.imread(path)
5.      while(np.all(img==None)):
6.          print("无法读取图片")
7.          path=input("图片路径:")
8.          img = cv2.imread(path)
9.      img_Copy=img.copy()
10.
11.     #图像处理函数
12.     LastButNotLeast(img,img_Copy)
13.
14.     #输出结果
15.     plt.subplot(1,2,1)
16.     img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
17.     plt.imshow(img)
18.     plt.title("The original image")
19.
20.     plt.subplot(1,2,2)
21.     img_Copy=cv2.cvtColor(img_Copy,cv2.COLOR_BGR2RGB)
22.     plt.imshow(img_Copy)
23.     plt.title("The image after processing")
24.
25.     plt.show()  

附件:源码

import collections
import mathimport cv2
import matplotlib.pyplot as plt
import numpy as np#颜色字典
def ColorList():dict = collections.defaultdict(list)#黑色lower_black = np.array([0, 0, 0])upper_black = np.array([180, 255, 46])color_list = []color_list.append(lower_black)color_list.append(upper_black)dict['black'] = color_list#灰色lower_gray = np.array([0, 0, 46])upper_gray = np.array([180, 43, 220])color_list = []color_list.append(lower_gray)color_list.append(upper_gray)dict['gray']=color_list#白色lower_white = np.array([0, 0, 221])upper_white = np.array([180, 30, 255])color_list = []color_list.append(lower_white)color_list.append(upper_white)dict['white'] = color_list#粉色lower_pink = np.array([156, 43, 46])upper_pink = np.array([180, 255, 255])color_list = []color_list.append(lower_pink)color_list.append(upper_pink)dict['pink']=color_list#红色lower_red = np.array([0, 43, 46])upper_red = np.array([10, 255, 255])color_list = []color_list.append(lower_red)color_list.append(upper_red)dict['red'] = color_list#橙色lower_orange = np.array([11, 43, 46])upper_orange = np.array([25, 255, 255])color_list = []color_list.append(lower_orange)color_list.append(upper_orange)dict['orange'] = color_list#黄色lower_yellow = np.array([26, 43, 46])upper_yellow = np.array([34, 255, 255])color_list = []color_list.append(lower_yellow)color_list.append(upper_yellow)dict['yellow'] = color_list#绿色lower_green = np.array([35, 43, 46])upper_green = np.array([77, 255, 255])color_list = []color_list.append(lower_green)color_list.append(upper_green)dict['green'] = color_list#青色lower_cyan = np.array([78, 43, 46])upper_cyan = np.array([99, 255, 255])color_list = []color_list.append(lower_cyan)color_list.append(upper_cyan)dict['cyan'] = color_list#蓝色lower_blue = np.array([100, 43, 46])upper_blue = np.array([124, 255, 255])color_list = []color_list.append(lower_blue)color_list.append(upper_blue)dict['blue'] = color_list# 紫色lower_purple = np.array([125, 43, 46])upper_purple = np.array([155, 255, 255])color_list = []color_list.append(lower_purple)color_list.append(upper_purple)dict['purple'] = color_listreturn dict#颜色判断
def findColor(imgcut):img_hsv=cv2.cvtColor(imgcut,cv2.COLOR_BGR2HSV)color_dict=ColorList()#print(color_dict)color_most=0color_now=Nonefor color in color_dict:#二值化 和颜色字典比较 在上下限之间的像素变为255,之外的所有像素变为0color_cmp=cv2.inRange(img_hsv,color_dict[color][0],color_dict[color][1])#膨胀 使颜色分割成块并更突出color_boom = cv2.dilate(color_cmp,None,iterations=1)#取出每一小块contours,hierarchy=cv2.findContours(color_boom.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)color_area=0for img in contours:color_area+=cv2.contourArea(img)if(color_area>color_most):color_most=color_areacolor_now=colorreturn color_now#计算斜率
def k_count(x1,y1,x2,y2):if((x2-x1)==0):x2+=0.01k=(y2-y1)/(x2-x1)if (k==0):k+=0.01return k#计算角度
def angle_count(k1,k2):angle=math.atan2((k2-k1),(1+k1*k2))angle=angle*180/math.pireturn abs(angle)#图形处理
def LastButNotLeast(imginit,imgcopy):# 灰度化img_Gray = cv2.cvtColor(imginit, cv2.COLOR_BGR2GRAY)# 高斯平滑img_Blur = cv2.GaussianBlur(img_Gray, (3, 3), 1)# 边缘检测img_Canny = cv2.Canny(img_Blur, 50, 50)#得到图片中所有图形的轮廓#findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchycontours,hierarchy=cv2.findContours(img_Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)#参数:输入图像,霍夫梯度法,分辨率,最小距离,检测方法的对应的参数*2,半径for img in contours:    #计算面积 太小就不算了area=cv2.contourArea(img)if area>80:perimeter=cv2.arcLength(img,True)#折线化side=cv2.approxPolyDP(img,0.01*perimeter,True)#print(side)#计算有几条线sideNum=len(side)#print(sideNum)#计算边长length=[]k=[]for i in range(0,sideNum):if(i+1<sideNum):                l=((side[i][0][0]-side[i+1][0][0])**2+(side[i][0][1]-side[i+1][0][1])**2)**(1/2)ktemp=k_count(side[i][0][0],side[i][0][1],side[i+1][0][0],side[i+1][0][1])else:l=((side[i][0][0]-side[0][0][0])**2+(side[i][0][1]-side[0][0][1])**2)**(1/2)ktemp=k_count(side[i][0][0],side[i][0][1],side[0][0][0],side[0][0][1])length.append(l)k.append(ktemp)#print(length)#计算角度angle=[]for i in range(0,sideNum):if(i+1<sideNum):ang=angle_count(k[i],k[i+1])else:ang=angle_count(k[i],k[0])angle.append(ang)#print(angle)#形状判断#三角形if sideNum==3:tag="triangle"#其他四边形elif sideNum==4:tag="Other quadrilateral"flag=0#菱形err=5if(length[1]-err<=length[0]<=length[1]+err):if(length[2]-err<=length[1]<=length[2]+err):if(length[3]-err<=length[2]<=length[3]+err):if(length[0]-err<=length[3]<=length[0]+err):tag="diamond"flag=1#矩形if(89<angle[0]<91):if(89<angle[1]<91):if(89<angle[2]<91):if(89<angle[3]<91):tag="rectangular"if(flag==1):tag="square"elif sideNum==5:tag="pentagon"elif sideNum==6:tag="hexagon"elif sideNum==10:tag="five-pointed star"elif sideNum>10:tag="circle"else:tag="None"                #定个位x,y,wide,high=cv2.boundingRect(side)#裁剪中心位置x0=int(x+(wide/2))y0=int(y+(high/2))err=25imgCut=imginit[(y0-err):(y0+err),(x0-err):(x0+err)]color=findColor(imgCut)#添加标签cv2.rectangle(imgcopy, (x-5, y-5), (x + wide+5, y + high+5), (0, 235, 6), 2)cv2.putText(imgcopy, tag,(x, y-28), cv2.FONT_HERSHEY_TRIPLEX, 0.85,(0,0, 255), 1)cv2.putText(imgcopy, color,(x, y-5), cv2.FONT_HERSHEY_TRIPLEX, 0.85,(0, 0, 255), 1)if __name__ == "__main__":path=input("图片路径:")#path=r"D:\test.png"img = cv2.imread(path)while(np.all(img==None)):print("无法读取图片")path=input("图片路径:")img = cv2.imread(path)img_Copy=img.copy()#图像处理函数LastButNotLeast(img,img_Copy)#输出结果plt.subplot(1,2,1)img=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)plt.imshow(img)plt.title("The original image")plt.subplot(1,2,2)img_Copy=cv2.cvtColor(img_Copy,cv2.COLOR_BGR2RGB)plt.imshow(img_Copy)plt.title("The image after processing")plt.show()

图形形状及颜色识别【Python大作业】相关推荐

  1. _【超详细指北】python大作业!

    [超详细指北]python大作业! ​ 这是笔者最近写python大作业时写的一个实现过程笔记,也就是基本上可以说是本人从0开始上手的一个python练习.程序和本文档从 4.29-5.15日 总共历 ...

  2. Python大作业——两种方法设计计算器(使用wx库)。

    python大作业 本次设计用Pycharm开发工具,Python语言进行主要功能是基于图形用户面的多功能.该计算器的主要功能是加.减.乘.除等常规运算以及指数,对数,三角函数等科学运算功能.该计算器 ...

  3. Python大作业——爬虫+可视化+数据分析+数据库(数据分析篇)

    个人博客 Python大作业--爬虫+可视化+数据分析+数据库(简介篇) Python大作业--爬虫+可视化+数据分析+数据库(爬虫篇) Python大作业--爬虫+可视化+数据分析+数据库(可视化篇 ...

  4. Python008: Python大作业之移动的小火车动画(一)

    Python大作业 1. 要求 使用Python语言,使用的库不限 如下图1的火车轨道 如下图2的火车(2节车厢) 小火车可以在轨道上动态的运行 小火车的大小可调.轨道的大小可调 2. 用到的第三方库 ...

  5. kaggle经典题--“泰坦尼克号”--0.8275准确率--东北大学20级python大作业开源(附详细解法与全部代码以及实验报告)

    kaggle经典题--"泰坦尼克号"--0.8275准确率--东北大学20级python大作业开源(附详细解法与全部代码以及实验报告) 前言 开发环境 一.导入包: 二.实验数据的 ...

  6. Python011: Python大作业之移动的小火车动画(四)代码实现

    书接上文:Python010: Python大作业之移动的小火车动画(三)结果显示 0.注意: ​ 该项目使用的库和资源说明如下: pygame 2.0.1 (SDL 2.0.14, Python 3 ...

  7. pygame飞机大战小游戏(python大作业)

    一.项目背景 python大作业,在查看了老师给的链接发现教学视频不完整,所以借用了同学的<Python编程 从入门到实践>中的一个项目,学习模仿. 二.游戏具体介绍 这是一款由辉辉亲自打 ...

  8. Python大作业之就诊卡管理信息系统[原创]

    Python大作业之就诊卡管理信息系统[原创] 项目地址: 网页链接:http://patientcard.dreamtownapi.com/ 后端地址:http://django.dreamtown ...

  9. Python大作业——爬虫+可视化+数据分析+数据库(数据库篇)

    相关链接 Python大作业--爬虫+可视化+数据分析+数据库(简介篇) Python大作业--爬虫+可视化+数据分析+数据库(爬虫篇) Python大作业--爬虫+可视化+数据分析+数据库(数据分析 ...

  10. python大作业01

    python大作业01 使用组合数据类型(列表,元组,字典,集合)中任意一种存储方式,完成一个简单的学生管理系统,可以多次录入学生信息到系统并完成基本的 增加.删除.修改.查询操作. 学生信息: 学号 ...

最新文章

  1. 【安装】Linux系统(X64)安装Oracle 11g
  2. 带你学python基础:模块和包
  3. 最佳实践 | 数据库迁云解决方案选型 流程全解析
  4. matlab gpu deep learning_优秀!这个库帮你使用GPU加速传统机器学习方法和Pandas数据处理...
  5. Python 远程开关机
  6. php orm教程,Laravel ORM 数据model操作教程
  7. android浮动按钮_Android扩展浮动操作按钮
  8. 华为云怎么样_为什么阿里云要迁移到华为云?详细过程分析
  9. SpringBoot+SpringAOP+Java自定义注解+mybatis实现切库读写分离
  10. lua搭建ui_LTUI, 一个基于 lua 的跨平台字符终端 UI 界面库
  11. 基于HMM的语音识别技术原理
  12. U盘无法格式化,变成8M,RAW格式,0字节的U盘修复教程
  13. Android 编写WiFi探针,一种WiFi探针路由器的制作方法
  14. 统计java代码行数_统计项目代码行数
  15. HTPPS请求 证书 解决方案
  16. 2023年北京师范大学应用统计考研上岸前辈备考经验指导
  17. 大数据平台架构技术选型与场景运用
  18. 未来计算机的应用方向,计算机应用现状及未来方向
  19. 台式计算机戴尔3020,戴尔 Dell OptiPlex 3020M 台式机整机 评测
  20. python爬取新浪微博内容_python机器登陆新浪微博抓取数据

热门文章

  1. 用c语言输入年份 月份 显示天数,java输入月份,年份,显示对应月份的天数,...
  2. JS打印之指定元素分页,自动插入分页符
  3. c语言所有符号作用,c语言中的所有符号
  4. 蓝光手游大师极速版 V1.0.82
  5. pgMP认证,还是再看看吧!
  6. 2016款MACBOOK PRO触控条版 安装WIN10初体验 及 无奈退货记
  7. 京东返利PHP采集关键字,php 抓取京东产品数据-标题,价格,首图片
  8. mac转换pin计算机,MAC对应PIN码表-2012.3.4整理
  9. @Transactional注解解析
  10. 关于利用Unity制作游戏登陆界面这件事