图形形状及颜色识别
一、题目要求
二、系统功能
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. #计算角度