浅谈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 相关文章推荐
Python3.x和Python2.x的区别介绍
Feb 12 Python
python根据开头和结尾字符串获取中间字符串的方法
Mar 26 Python
python基于xmlrpc实现二进制文件传输的方法
Jun 02 Python
Python函数式编程指南(二):从函数开始
Jun 24 Python
Python使用arrow库优雅地处理时间数据详解
Oct 10 Python
用Python实现筛选文件脚本的方法
Oct 27 Python
Python list列表中删除多个重复元素操作示例
Feb 27 Python
python 整数越界问题详解
Jun 27 Python
Python如何优雅获取本机IP方法
Nov 10 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
Feb 19 Python
python保存大型 .mat 数据文件报错超出 IO 限制的操作
May 10 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
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
PHP弹出对话框技巧详细解读
2015/09/26 PHP
javascript window对象属性整理
2009/10/24 Javascript
javascript数组排序汇总
2015/07/07 Javascript
jQuery往返城市和日期查询实例讲解
2015/10/09 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
easyui关于validatebox实现多重规则验证的方法(必看)
2017/04/12 Javascript
JavaScript EventEmitter 背后的秘密 完整版
2018/03/29 Javascript
vue 自定义 select内置组件
2018/04/10 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
在vue-cli的组件模板里使用font-awesome的两种方法
2018/09/28 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
[58:37]Serenity vs Fnatic 2018国际邀请赛淘汰赛BO1 8.21
2018/08/22 DOTA
[50:50]完美世界DOTA2联赛PWL S3 Galaxy Racer vs Phoenix 第一场 12.10
2020/12/13 DOTA
[01:36:17]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第一场 1月31日
2021/03/11 DOTA
Python实现加载及解析properties配置文件的方法
2018/03/29 Python
解决tensorflow测试模型时NotFoundError错误的问题
2018/07/27 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
Python List cmp()知识点总结
2019/02/18 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
Python3模拟登录操作实例分析
2019/03/12 Python
django admin组件使用方法详解
2019/07/19 Python
Python图像处理模块ndimage用法实例分析
2019/09/05 Python
django实现支付宝支付实例讲解
2019/10/17 Python
基于Python fminunc 的替代方法
2020/02/29 Python
使用phonegap查找联系人的实现方法
2017/03/31 HTML / CSS
捷克体育用品购物网站:D-sport
2017/12/28 全球购物
类和结构的区别
2012/08/15 面试题
岗位竞聘演讲稿范文
2014/04/24 职场文书
委托书的写法
2014/09/16 职场文书
2015幼儿园新学期寄语
2015/02/27 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
PostgreSQL并行计算算法及参数强制并行度设置方法
2022/04/07 PostgreSQL