浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法
【更新】主要提供两种方案:
方案一:(参考网上代码,感觉实用性不是很强)使用PIL截取图像,然后将RGB转为HSV进行判断,统计判断颜色,最后输出RGB值
方案二:使用opencv库函数进行处理。(效果不错)
1、将图片颜色转为hsv,
2、使用cv2.inRange()函数进行背景颜色过滤
3、将过滤后的颜色进行二值化处理
4、进行形态学腐蚀膨胀,cv2.dilate()
5、统计白色区域面积
详解:方案一:
转载出处:www.nhooo.com/article/62526.htm
项目实际需要,对识别出来的车车需要标记颜色,因此采用方案如下:
1、通过importPIL.ImageGrabasImageGrab将识别出来的汽车矩形框裁剪出来
img_color=image.crop((left,right,top,bottom))
2、将裁剪出来的image进行颜色图像识别
RGB和hsv中间的转换关系,网上很多,我也没有具体去研究如何转换的,能用就行
附上测试,封装成函数方法:
importcolorsys importPIL.ImageasImage defget_dominant_color(image): max_score=0.0001 dominant_color=None forcount,(r,g,b)inimage.getcolors(image.size[0]*image.size[1]): #转为HSV标准 saturation=colorsys.rgb_to_hsv(r/255.0,g/255.0,b/255.0)[1] y=min(abs(r*2104+g*4130+b*802+4096+131072)>>13,235) y=(y-16.0)/(235-16) #忽略高亮色 ify>0.9: continue score=(saturation+0.1)*count ifscore>max_score: max_score=score dominant_color=(r,g,b) returndominant_color if__name__=='__main__': image=Image.open('test.jpg') image=image.convert('RGB') print(get_dominant_color(image))
测试图
结果
在这个网上查询RGB数值对应的颜色
http://tools.jb51.net/static/colorpicker/index.html
方案二:opencv计算机视觉库函数处理
1、定义HSV颜色字典,参考网上HSV颜色分类
importnumpyasnp importcollections #定义字典存放颜色分量上下限 #例如:{颜色:[min分量,max分量]} #{'red':[array([160,43,46]),array([179,255,255])]} defgetColorList(): 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_red=np.array([156,43,46]) upper_red=np.array([180,255,255]) color_list=[] color_list.append(lower_red) color_list.append(upper_red) dict['red']=color_list #红色2 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['red2']=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_list returndict if__name__=='__main__': color_dict=getColorList() print(color_dict) num=len(color_dict) print('num=',num) fordincolor_dict: print('key=',d) print('value=',color_dict[d][1])
2、颜色识别
importcv2 importnumpyasnp importcolorList filename='car04.jpg' #处理图片 defget_color(frame): print('goinget_color') hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV) maxsum=-100 color=None color_dict=colorList.getColorList() fordincolor_dict: mask=cv2.inRange(hsv,color_dict[d][0],color_dict[d][1]) cv2.imwrite(d+'.jpg',mask) binary=cv2.threshold(mask,127,255,cv2.THRESH_BINARY)[1] binary=cv2.dilate(binary,None,iterations=2) img,cnts,hiera=cv2.findContours(binary.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) sum=0 forcincnts: sum+=cv2.contourArea(c) ifsum>maxsum: maxsum=sum color=d returncolor if__name__=='__main__': frame=cv2.imread(filename) print(get_color(frame))
3、结果
原始图像(网上找的测试图):
1)、使用cv2.inRange()函数过滤背景后图片如下:
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。