浅谈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 相关文章推荐
PHP webshell检查工具 python实现代码
Sep 15 Python
Python天气预报采集器实现代码(网页爬虫)
Oct 07 Python
将Python的Django框架与认证系统整合的方法
Jul 24 Python
python实现闹钟定时播放音乐功能
Jan 25 Python
Python实现的端口扫描功能示例
Apr 08 Python
Python之列表的插入&替换修改方法
Jun 28 Python
详解python里的命名规范
Jul 16 Python
Python 实现王者荣耀中的敏感词过滤示例
Jan 21 Python
python实现的生成word文档功能示例
Aug 23 Python
基于python及pytorch中乘法的使用详解
Dec 27 Python
python3连接MySQL8.0的两种方式
Feb 17 Python
TensorFlow的自动求导原理分析
May 26 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.ini中文版(1)
2006/10/09 PHP
通过对服务器端特性的配置加强php的安全
2006/10/09 PHP
Yii使用CLinkPager分页实例详解
2014/07/23 PHP
php生成二维码
2015/08/10 PHP
php监测数据是否成功插入到Mysql数据库的方法
2016/11/25 PHP
php 根据自增id创建唯一编号类
2017/04/06 PHP
PHP面向对象之领域模型+数据映射器实例(分析)
2017/06/21 PHP
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
jQuery中:animated选择器用法实例
2014/12/29 Javascript
原生js封装二级城市下拉列表的实现代码
2016/06/16 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
浅谈javascript中的 “ && ” 和 “ || ”
2017/02/02 Javascript
javascript算法之二叉搜索树的示例代码
2017/09/12 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
在vue.js中使用JSZip实现在前端解压文件的方法
2018/09/05 Javascript
jQuery实现的模仿雨滴下落动画效果
2018/12/11 jQuery
JavaScript基础之静态方法和实例方法分析
2018/12/26 Javascript
详解JavaScript 的变量
2019/03/08 Javascript
D3.js(v3)+react 实现带坐标与比例尺的柱形图 (V3版本)
2019/05/09 Javascript
JavaScript一元正号运算符示例代码
2019/06/30 Javascript
JavaScript实现商品评价五星好评
2020/11/30 Javascript
利用python获得时间的实例说明
2013/03/25 Python
在Django model中设置多个字段联合唯一约束的实例
2019/07/17 Python
Python学习笔记之错误和异常及访问错误消息详解
2019/08/08 Python
Python random库使用方法及异常处理方案
2020/03/02 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
突袭HTML5之Javascript API扩展3—本地存储全新体验
2013/01/31 HTML / CSS
加拿大时尚少女服装品牌:Garage
2016/10/10 全球购物
UNDONE手表官网:世界领先的定制手表品牌
2018/11/13 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
数控机械专业个人的自我评价
2014/01/02 职场文书
资料员岗位职责
2015/02/10 职场文书
2019职场实习报告该怎么写?
2019/07/01 职场文书
Python中seaborn库之countplot的数据可视化使用
2021/06/11 Python
用Python创建简易网站图文教程
2021/06/11 Python