浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法


Posted in Python onOctober 25, 2019

【更新】主要提供两种方案:

方案一:(参考网上代码,感觉实用性不是很强)使用PIL截取图像,然后将RGB转为HSV进行判断,统计判断颜色,最后输出RGB值

方案二:使用opencv库函数进行处理。(效果不错)

1、将图片颜色转为hsv,
2、使用cv2.inRange()函数进行背景颜色过滤
3、将过滤后的颜色进行二值化处理
4、进行形态学腐蚀膨胀,cv2.dilate()
5、统计白色区域面积

详解:方案一:

转载出处:3water.com/article/62526.htm

项目实际需要,对识别出来的车车需要标记颜色,因此采用方案如下:

1、通过import PIL.ImageGrab as ImageGrab 将识别出来的汽车矩形框裁剪出来

img_color=image.crop((left,right,top,bottom))

2、将裁剪出来的image进行颜色图像识别

RGB和hsv中间的转换关系,网上很多,我也没有具体去研究如何转换的,能用就行

附上测试,封装成函数方法:

import colorsys
import PIL.Image as Image
 
def get_dominant_color(image):
  max_score = 0.0001
  dominant_color = None
  for count,(r,g,b) in image.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)
 
    #忽略高亮色
    if y > 0.9:
      continue
    score = (saturation+0.1)*count
    if score > max_score:
      max_score = score
      dominant_color = (r,g,b)
  return dominant_color
 
 
if __name__ == '__main__':
  image = Image.open('test.jpg')
  image = image.convert('RGB')
  print(get_dominant_color(image))

测试图

浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法

结果

浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法

在这个网上查询RGB数值对应的颜色

浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法

方案二:opencv计算机视觉库函数处理

1、定义HSV颜色字典,参考网上HSV颜色分类

浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法

代码如下:

import numpy as np
import collections
 
#定义字典存放颜色分量上下限
#例如:{颜色: [min分量, max分量]}
#{'red': [array([160, 43, 46]), array([179, 255, 255])]}
 
def getColorList():
  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
 
  return dict
 
 
if __name__ == '__main__':
  color_dict = getColorList()
  print(color_dict)
 
  num = len(color_dict)
  print('num=',num)
 
  for d in color_dict:
    print('key=',d)
    print('value=',color_dict[d][1])

2、颜色识别

import cv2
import numpy as np
import colorList
 
filename='car04.jpg'
 
#处理图片
def get_color(frame):
  print('go in get_color')
  hsv = cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
  maxsum = -100
  color = None
  color_dict = colorList.getColorList()
  for d in color_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
    for c in cnts:
      sum+=cv2.contourArea(c)
    if sum > maxsum :
      maxsum = sum
      color = d
 
  return color
 
 
if __name__ == '__main__':
  frame = cv2.imread(filename)
  print(get_color(frame))

3、结果

原始图像(网上找的测试图):

浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法

1)、使用cv2.inRange()函数过滤背景后图片如下:

浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法

2)、可见使用白色分量过滤背景后,出现车辆的轮廓,因此,能够计算白色区域的面积,最大的则为该物体颜色

浅谈Python3识别判断图片主要颜色并和颜色库进行对比的方法

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现清屏的方法
Apr 30 Python
python中urlparse模块介绍与使用示例
Nov 19 Python
使用TensorFlow实现SVM
Sep 06 Python
Python3编码问题 Unicode utf-8 bytes互转方法
Oct 26 Python
对Python中plt的画图函数详解
Nov 07 Python
使用python打印十行杨辉三角过程详解
Jul 10 Python
Python封装成可带参数的EXE安装包实例
Aug 24 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 Python
python numpy--数组的组合和分割实例
Feb 24 Python
python实现定时发送邮件
Dec 23 Python
Django中的DateTimeField和DateField实现
Feb 24 Python
用Python将库打包发布到pypi
Apr 13 Python
Python二元赋值实用技巧解析
Oct 25 #Python
Python字典常见操作实例小结【定义、添加、删除、遍历】
Oct 25 #Python
基于Python实现签到脚本过程解析
Oct 25 #Python
python实现大学人员管理系统
Oct 25 #Python
Python队列、进程间通信、线程案例
Oct 25 #Python
python银行系统实现源码
Oct 25 #Python
python Event事件、进程池与线程池、协程解析
Oct 25 #Python
You might like
PHP 获取远程文件大小的3种解决方法
2013/07/11 PHP
PHP生成迅雷、快车、旋风等软件的下载链接代码实例
2014/05/12 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
php面向对象的用户登录身份验证
2017/06/08 PHP
Laravel框架路由设置与使用示例
2018/06/12 PHP
js 页面执行时间计算代码
2009/03/04 Javascript
js常用代码段收集
2011/10/28 Javascript
jquery如何改变html标签的样式(两种实现方法)
2013/01/16 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
Extjs4中的分页应用结合前后台
2013/12/13 Javascript
JqueryMobile动态生成listView并实现刷新的两种方法
2014/03/05 Javascript
javascript闭包的理解
2015/04/01 Javascript
js仿支付宝多方框输入支付密码效果
2016/09/27 Javascript
jQuery实现单击按钮遮罩弹出对话框效果(2)
2017/02/20 Javascript
AngularJS实时获取并显示密码的方法
2018/02/06 Javascript
vue中$refs的用法及作用详解
2018/04/24 Javascript
jQuery基于闭包实现的显示与隐藏div功能示例
2018/06/09 jQuery
puppeteer库入门初探
2019/01/09 Javascript
layui输入框只允许输入中文且判断长度的例子
2019/09/18 Javascript
vue动态加载SVG文件并修改节点数据的操作代码
2020/08/17 Javascript
ES11屡试不爽的新特性,你用上了几个
2020/10/21 Javascript
[04:28]DOTA2亚洲邀请赛小组赛第五日 TOP10精彩集锦
2015/02/03 DOTA
按日期打印Python的Tornado框架中的日志的方法
2015/05/02 Python
Python入门教程之运算符与控制流
2016/08/17 Python
Python字典数据对象拆分的简单实现方法
2017/12/05 Python
Python中的Numpy矩阵操作
2018/08/12 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
PyCharm 在Windows的有用快捷键详解
2020/04/07 Python
Python中有几个关键字
2020/06/04 Python
CSS3实现自定义Checkbox特效实例代码
2017/04/24 HTML / CSS
2014年党务公开实施方案
2014/02/27 职场文书
供货协议书
2014/04/22 职场文书
移交协议书
2014/08/19 职场文书
兵马俑导游词
2015/02/02 职场文书
关于拾金不昧的感谢信(五篇)
2019/10/18 职场文书
vue本地构建热更新卡顿的问题“75 advanced module optimization”完美解决方案
2022/08/05 Vue.js