方案一:(参考网上代码,感觉实用性不是很强)使用PIL截取图像,然后将RGB转为HSV进行判断,统计判断颜色,最后输出RGB值
方案二:使用opencv库函数进行处理。(效果不错)
1、将图片颜色转为hsv,2、使用cv2.inRange()函数进行背景颜色过滤3、将过滤后的颜色进行二值化处理4、进行形态学腐蚀膨胀,cv2.dilate()5、统计白色区域面积
详解:方案一:
项目实际需要,对识别出来的车车需要标记颜色,因此采用方案如下:
1、通过importPIL.ImageGrabasImageGrab将识别出来的汽车矩形框裁剪出来
img_color=image.crop((left,right,top,bottom))2、将裁剪出来的image进行颜色图像识别
RGB和hsv中间的转换关系,网上很多,我也没有具体去研究如何转换的,能用就行
附上测试,封装成函数方法:
importcolorsysimportPIL.ImageasImagedefget_dominant_color(image):max_score=0.0001dominant_color=Noneforcount,(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:continuescore=(saturation+0.1)*countifscore>max_score:max_score=scoredominant_color=(r,g,b)returndominant_colorif__name__=='__main__':image=Image.open('test.jpg')image=image.convert('RGB')print(get_dominant_color(image))测试图
结果
在这个网上查询RGB数值对应的颜色
方案二:opencv计算机视觉库函数处理
1、定义HSV颜色字典,参考网上HSV颜色分类
代码如下:
importcv2importnumpyasnpimportcolorListfilename='car04.jpg'#处理图片defget_color(frame):print('goinget_color')hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)maxsum=-100color=Nonecolor_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=0forcincnts:sum+=cv2.contourArea(c)ifsum>maxsum:maxsum=sumcolor=dreturncolorif__name__=='__main__':frame=cv2.imread(filename)print(get_color(frame))3、结果
原始图像(网上找的测试图):
1)、使用cv2.inRange()函数过滤背景后图片如下:
2)、可见使用白色分量过滤背景后,出现车辆的轮廓,因此,能够计算白色区域的面积,最大的则为该物体颜色
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。