浅谈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闭包实现计数器的方法
May 05 Python
Python批量创建迅雷任务及创建多个文件
Feb 13 Python
JSONLINT:python的json数据验证库实例解析
Nov 28 Python
python多进程中的内存复制(实例讲解)
Jan 05 Python
python3+PyQt5使用数据库表视图
Apr 24 Python
对python3中pathlib库的Path类的使用详解
Oct 14 Python
使用python 打开文件并做匹配处理的实例
Jan 02 Python
python 对字典按照value进行排序的方法
May 09 Python
用Python画小女孩放风筝的示例
Nov 23 Python
jupyter note 实现将数据保存为word
Apr 14 Python
anaconda安装pytorch1.7.1和torchvision0.8.2的方法(亲测可用)
Feb 01 Python
详解Python openpyxl库的基本应用
Feb 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
967 个函式
2006/10/09 PHP
PHP数组交集的优化代码分析
2011/03/06 PHP
一个php短网址的生成代码(仿微博短网址)
2014/05/07 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
Thinkphp 框架配置操作之动态配置、扩展配置及批量配置实例分析
2020/05/15 PHP
use jscript Create a SQL Server database
2007/06/16 Javascript
js 完美图片新闻轮转效果,腾讯大粤网首页图片轮转改造而来
2011/11/21 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
jQuery 3.0 的变化及使用方法
2016/02/01 Javascript
jquery自定义插件——window的实现【示例代码】
2016/05/06 Javascript
Javascript 普通函数和构造函数的区别
2016/11/05 Javascript
JavaScript实现跟随滚动缓冲运动广告框
2017/07/15 Javascript
JScript实现表格的简单操作
2017/08/15 Javascript
解析Vue 2.5的Diff算法
2017/11/28 Javascript
Vue工程模板文件 webpack打包配置方法
2017/12/26 Javascript
vue+jquery+lodash实现滑动时顶部悬浮固定效果
2018/04/28 jQuery
解决nodejs的npm命令无反应的问题
2018/05/17 NodeJs
详解react native页面间传递数据的几种方式
2018/11/07 Javascript
简单谈谈offsetleft、offsetTop和offsetParent
2020/12/04 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
python中requests爬去网页内容出现乱码问题解决方法介绍
2017/10/25 Python
Python 2.7中文显示与处理方法
2018/07/16 Python
python使用matplotlib模块绘制多条折线图、散点图
2020/04/26 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
python对列进行平移变换的方法(shift)
2019/01/10 Python
简单了解python中对象的取反运算符
2019/07/01 Python
使用Python的datetime库处理时间(RPA流程)
2019/11/24 Python
pandas的相关系数与协方差实例
2019/12/27 Python
Python 去除字符串中指定字符串
2020/03/05 Python
python编写softmax函数、交叉熵函数实例
2020/06/11 Python
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
澳大利亚家居用品零售商:Harris Scarfe
2020/10/10 全球购物
会计电算化专业毕业生推荐信
2013/12/24 职场文书
买卖合同协议书范本
2014/10/18 职场文书
长辈生日祝福语大全(72句)
2019/08/09 职场文书
MySQL数据库表约束讲解
2022/06/21 MySQL