浅谈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处理中文编码和判断编码示例
Feb 26 Python
python实现的简单RPG游戏流程实例
Jun 28 Python
Python编程中装饰器的使用示例解析
Jun 20 Python
python3实现TCP协议的简单服务器和客户端案例(分享)
Jun 14 Python
python数据预处理之将类别数据转换为数值的方法
Jul 05 Python
Python基于更相减损术实现求解最大公约数的方法
Apr 04 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
May 25 Python
Python time库基本使用方法分析
Dec 13 Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 Python
python列表的逆序遍历实现
Apr 20 Python
使用keras和tensorflow保存为可部署的pb格式
May 25 Python
python数字图像处理:图像简单滤波
Jun 28 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函数
2006/10/09 PHP
php简单实现查询数据库返回json数据
2015/04/16 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
PHP curl批处理及多请求并发实现方法分析
2018/08/15 PHP
tp5(thinkPHP5)框架数据库Db增删改查常见操作总结
2019/01/10 PHP
JavaScript中void(0)的具体含义解释
2007/02/27 Javascript
JavaScript中使用构造函数实现继承的代码
2010/08/12 Javascript
js 幻灯片的实现
2011/12/06 Javascript
利用jQuery实现可输入搜索文字的下拉框
2013/10/23 Javascript
window.open()实现post传递参数
2015/03/12 Javascript
JavaScript实现将xml转换成html table表格的方法
2015/04/17 Javascript
js控制多图左右滚动切换效果代码分享
2015/08/26 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
很棒的js Tab选项卡切换效果
2016/08/30 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
Python中atexit模块的基本使用示例
2015/07/08 Python
使用Python读取大文件的方法
2018/02/11 Python
python实现简单flappy bird
2018/12/24 Python
新手入门Python编程的8个实用建议
2019/07/12 Python
python进程池实现的多进程文件夹copy器完整示例
2019/11/27 Python
python按顺序重命名文件并分类转移到各个文件夹中的实现代码
2020/07/21 Python
canvas绘图按照contain或者cover方式适配并居中显示
2019/02/18 HTML / CSS
泰海淘:泰国king Power王权免税集团旗下跨境海淘综合型电商
2020/07/26 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
社会保险接收函
2014/01/12 职场文书
国家税务局干部作风整顿整改措施
2014/09/18 职场文书
2014年安全保卫工作总结
2014/11/13 职场文书
2014年幼儿园德育工作总结
2014/12/17 职场文书
医院科室评语
2015/01/04 职场文书
鉴史问廉观后感
2015/06/10 职场文书
二十年同学聚会感言
2015/07/30 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
Python用tkinter实现自定义记事本的方法详解
2022/03/31 Python