图形形状及颜色识别【Python大作业】
图形形状及颜色识别
- 一、题目要求
- 二、系统功能
- 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大作业】相关推荐
- _【超详细指北】python大作业!
[超详细指北]python大作业! 这是笔者最近写python大作业时写的一个实现过程笔记,也就是基本上可以说是本人从0开始上手的一个python练习.程序和本文档从 4.29-5.15日 总共历 ...
- Python大作业——两种方法设计计算器(使用wx库)。
python大作业 本次设计用Pycharm开发工具,Python语言进行主要功能是基于图形用户面的多功能.该计算器的主要功能是加.减.乘.除等常规运算以及指数,对数,三角函数等科学运算功能.该计算器 ...
- Python大作业——爬虫+可视化+数据分析+数据库(数据分析篇)
个人博客 Python大作业--爬虫+可视化+数据分析+数据库(简介篇) Python大作业--爬虫+可视化+数据分析+数据库(爬虫篇) Python大作业--爬虫+可视化+数据分析+数据库(可视化篇 ...
- Python008: Python大作业之移动的小火车动画(一)
Python大作业 1. 要求 使用Python语言,使用的库不限 如下图1的火车轨道 如下图2的火车(2节车厢) 小火车可以在轨道上动态的运行 小火车的大小可调.轨道的大小可调 2. 用到的第三方库 ...
- kaggle经典题--“泰坦尼克号”--0.8275准确率--东北大学20级python大作业开源(附详细解法与全部代码以及实验报告)
kaggle经典题--"泰坦尼克号"--0.8275准确率--东北大学20级python大作业开源(附详细解法与全部代码以及实验报告) 前言 开发环境 一.导入包: 二.实验数据的 ...
- Python011: Python大作业之移动的小火车动画(四)代码实现
书接上文:Python010: Python大作业之移动的小火车动画(三)结果显示 0.注意: 该项目使用的库和资源说明如下: pygame 2.0.1 (SDL 2.0.14, Python 3 ...
- pygame飞机大战小游戏(python大作业)
一.项目背景 python大作业,在查看了老师给的链接发现教学视频不完整,所以借用了同学的<Python编程 从入门到实践>中的一个项目,学习模仿. 二.游戏具体介绍 这是一款由辉辉亲自打 ...
- Python大作业之就诊卡管理信息系统[原创]
Python大作业之就诊卡管理信息系统[原创] 项目地址: 网页链接:http://patientcard.dreamtownapi.com/ 后端地址:http://django.dreamtown ...
- Python大作业——爬虫+可视化+数据分析+数据库(数据库篇)
相关链接 Python大作业--爬虫+可视化+数据分析+数据库(简介篇) Python大作业--爬虫+可视化+数据分析+数据库(爬虫篇) Python大作业--爬虫+可视化+数据分析+数据库(数据分析 ...
- python大作业01
python大作业01 使用组合数据类型(列表,元组,字典,集合)中任意一种存储方式,完成一个简单的学生管理系统,可以多次录入学生信息到系统并完成基本的 增加.删除.修改.查询操作. 学生信息: 学号 ...
最新文章
- 【安装】Linux系统(X64)安装Oracle 11g
- 带你学python基础:模块和包
- 最佳实践 | 数据库迁云解决方案选型 流程全解析
- matlab gpu deep learning_优秀!这个库帮你使用GPU加速传统机器学习方法和Pandas数据处理...
- Python 远程开关机
- php orm教程,Laravel ORM 数据model操作教程
- android浮动按钮_Android扩展浮动操作按钮
- 华为云怎么样_为什么阿里云要迁移到华为云?详细过程分析
- SpringBoot+SpringAOP+Java自定义注解+mybatis实现切库读写分离
- lua搭建ui_LTUI, 一个基于 lua 的跨平台字符终端 UI 界面库
- 基于HMM的语音识别技术原理
- U盘无法格式化,变成8M,RAW格式,0字节的U盘修复教程
- Android 编写WiFi探针,一种WiFi探针路由器的制作方法
- 统计java代码行数_统计项目代码行数
- HTPPS请求 证书 解决方案
- 2023年北京师范大学应用统计考研上岸前辈备考经验指导
- 大数据平台架构技术选型与场景运用
- 未来计算机的应用方向,计算机应用现状及未来方向
- 台式计算机戴尔3020,戴尔 Dell OptiPlex 3020M 台式机整机 评测
- python爬取新浪微博内容_python机器登陆新浪微博抓取数据
热门文章
- 用c语言输入年份 月份 显示天数,java输入月份,年份,显示对应月份的天数,...
- JS打印之指定元素分页,自动插入分页符
- c语言所有符号作用,c语言中的所有符号
- 蓝光手游大师极速版 V1.0.82
- pgMP认证,还是再看看吧!
- 2016款MACBOOK PRO触控条版 安装WIN10初体验 及 无奈退货记
- 京东返利PHP采集关键字,php 抓取京东产品数据-标题,价格,首图片
- mac转换pin计算机,MAC对应PIN码表-2012.3.4整理
- @Transactional注解解析
- 关于利用Unity制作游戏登陆界面这件事