失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 图形形状及颜色识别【Python大作业】

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

时间:2023-09-13 13:38:21

相关推荐

图形形状及颜色识别【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 collectionsimport mathimport cv2import matplotlib.pyplot as pltimport 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大作业】》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。