图形形状及颜色识别【Python大作业】

一、题目要求

在这里插入图片描述

二、系统功能

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.	            #计算角度  
  • 11
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值