当前位置:   article > 正文

图形形状及颜色识别【Python大作业】_python 识别五角星 三角形 正方形

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 

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/836861
推荐阅读
相关标签
  

闽ICP备14008679号