python下对hsv颜色空间进行量化操作


Posted in Python onJune 04, 2020

更新:优化了代码,理由numpy的ufunc函数功能替换了之前的双重for循环,测试图片大小为692*1024*3,优化前运行时间为6.9s,优化后为0.8s。

由于工作需要,需要计算颜色直方图来提取颜色特征,但若不将颜色空间进行量化,则直方图矢量维数过高,不便于使用。但是看了opencv API后并未发现提供了相关函数能够在计算颜色直方图的同时进行量化,因此这部分功能只能自己实现。下面分为两个部分进行介绍:

一、颜色空间量化表

由于RGB模型不够直观,不符合人类视觉习惯,因此在进行颜色特征提取前,需要将照片从RGB颜色模型转换为更符合人类视觉的HSV模型。在提取颜色特征时,最常用的方法之一为颜色直方图法,但一张图片中出现的颜色一般特别多,导致直方图矢量的维数较高,因此需要对HSV空间进行量化。根据人眼对颜色的感知特性,采用较为常用的量化方法,即按照如下对应关系进行量化:

python下对hsv颜色空间进行量化操作

基于上述量化表,将各颜色分量按照下述公式合成为72维一维矢量:python下对hsv颜色空间进行量化操作

二、量化代码

代码使用纯python写成,效率偏低,处理388*500像素的照片用时1.45秒。在quantilize函数中,未使用if-else判断语句,因此至少节省了1/3的时间。但这个速度显然是无法令人满意的,用C++效率应该会更高点。如果有人有更好的想法,欢迎在下方评论交流。

#-*-coding:utf-8-*-
import cv2
import numpy as np
from datetime import datetime
from matplotlib import pyplot as plt

def colors(imagepath):
  img = cv2.imread(imagepath)
  hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
  nhsv = np.zeros(hsv.shape[:2], dtype=np.uint8)
  t2 = datetime.now()
  for i in range(hsv.shape[0]):
    for j in range(hsv.shape[1]):
      nhsv[i][j] = quantilize(hsv[i][j])
  print datetime.now() - t2
  hist = cv2.calcHist([nhsv], [0], None, [72], [0,71]) # 40x faster than np.histogramfaster than np.histogram
  plt.plot(hist,color = 'r')
  plt.xlim([0, 72])
  plt.show()

def quantilize(value):
  '''hsv直方图量化
  value : [21, 144, 23] h, s, v
  opencv中,h-[0,180], s-[0,255], v-[0,255]
  '''
  # 
  value[0] = value[0] * 2
  hlist = [20, 40, 75, 155, 190, 270, 290, 316, 360]
  svlist = [21, 178, 255]
  for i in range(len(hlist)):
    if value[0] <= hlist[i]:
      h = i % 8
      break
  for i in range(len(svlist)):
    if value[1] <= svlist[i]:
      s = i
      break
  for i in range(len(svlist)):
    if value[2] <= svlist[i]:
      v = i
      break
  return 9 * h + 3 * s + v

以上,欢迎批评交流~

三、更新

#-*-coding:utf-8-*-
import cv2
import numpy as np
from datetime import datetime
from matplotlib import pyplot as plt

hlist = [20, 40, 75, 155, 190, 270, 290, 316, 360]
svlist = [21, 178, 255]

def quantilize(h, s, v):
  '''hsv直方图量化'''
  # value : [21, 144, 23] h, s, v
  h = h * 2
  for i in range(len(hlist)):
    if h <= hlist[i]:
      h = i % 8
      break
  for i in range(len(svlist)):
    if s <= svlist[i]:
      s = i
      break
  for i in range(len(svlist)):
    if v <= svlist[i]:
      v = i
      break
  return 9 * h + 3 * s + v

quantilize_ufunc = np.frompyfunc(quantilize, 3, 1) # 自定义ufunc函数,即将quantilize函数转化为ufunc函数,其输入参数为3个,输出参数为1个。

def colors(img):
  hsv = cv2.cvtColor(img, cv2.COLOR_RGB2HSV)
  nhsv = quantilize_ufunc(hsv[:,:,0], hsv[:,:,1], hsv[:,:,2]).astype(np.uint8) # 由于frompyfunc函数返回结果为对象,所以需要转换类型
  hist = cv2.calcHist([nhsv], [0], None, [72], [0,71]) # 40x faster than np.histogram
  hist = hist.reshape(1, hist.shape[0]).astype(np.int32).tolist()[0]
  return hist

if __name__ == '__main__':
  img_path = path + 'test.jpg'
  img = cv2.imread(img_path)
  colors(img)

结果

[0, 11, 31490, 100, 3, 32685, 0, 28, 313, 0, 0, 3268, 31, 0, 558364, 6, 1, 441, 0, 0, 2301, 92, 0, 34056, 0, 1, 396, 0, 0, 2682, 84, 5, 712, 0, 137, 55, 0, 0, 1215, 20, 2, 224, 0, 3, 0, 0, 0, 13838, 56, 0, 23474, 63, 23, 1, 0, 0, 4764, 0, 0, 2335, 0, 25, 27, 0, 0, 2302, 5, 0, 1676, 1, 59, 389]

以上这篇python下对hsv颜色空间进行量化操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python深入学习之装饰器
Aug 31 Python
python中元类用法实例
Oct 10 Python
python计算对角线有理函数插值的方法
May 07 Python
python动态网页批量爬取
Feb 14 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
python实现简易云音乐播放器
Jan 04 Python
详解Python 函数如何重载?
Apr 23 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
Python Django view 两种return的实现方式
Mar 16 Python
python filecmp.dircmp实现递归比对两个目录的方法
May 22 Python
python3 简单实现组合设计模式
Jul 02 Python
Python根据字符串调用函数过程解析
Nov 05 Python
Python-opencv实现红绿两色识别操作
Jun 04 #Python
Python基于pandas绘制散点图矩阵代码实例
Jun 04 #Python
Python使用plt.boxplot() 参数绘制箱线图
Jun 04 #Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
Jun 04 #Python
Python中操作各种多媒体,视频、音频到图片的代码详解
Jun 04 #Python
Python简单实现词云图代码及步骤解析
Jun 04 #Python
Python坐标轴操作及设置代码实例
Jun 04 #Python
You might like
php 特殊字符处理函数
2008/09/05 PHP
PHP导入Excel到MySQL的方法
2011/04/23 PHP
php性能优化分析工具XDebug 大型网站调试工具
2011/05/22 PHP
PHP使用Pthread实现的多线程操作实例
2015/11/14 PHP
PHP简单的MVC框架实现方法
2015/12/01 PHP
PHP+Ajax实现的博客文章添加类别功能示例
2018/03/29 PHP
Laravel登录失败次数限制的实现方法
2020/08/26 PHP
jquery.jstree 增加节点的双击事件代码
2010/07/27 Javascript
JQuery入门——事件切换之toggle()方法应用介绍
2013/02/05 Javascript
Nodejs极简入门教程(一):模块机制
2014/10/25 NodeJs
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
JS使用eval()动态创建变量的方法
2016/06/03 Javascript
jQuery checkbox选中问题之prop与attr注意点分析
2016/11/15 Javascript
angularJS 指令封装回到顶部示例详解
2017/01/22 Javascript
jQuery正则验证注册页面经典实例
2017/06/10 jQuery
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
详解webpack与SPA实践之开发环境搭建
2017/12/18 Javascript
Vuex实现计数器以及列表展示效果
2018/03/10 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
js前端面试之同步与异步问题详解
2019/04/03 Javascript
Vuejs通过拖动改变元素宽度实现自适应
2020/09/02 Javascript
使用Python的Django框架实现事务交易管理的教程
2015/04/20 Python
Python使用getpass库读取密码的示例
2017/10/10 Python
Python解决抛小球问题 求小球下落经历的距离之和示例
2018/02/01 Python
在python win系统下 打开TXT文件的实例
2018/04/29 Python
基于python实现上传文件到OSS代码实例
2020/05/09 Python
基于Python把网站域名解析成ip地址
2020/05/25 Python
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
承办会议欢迎词
2014/01/17 职场文书
小学防溺水制度
2014/01/29 职场文书
活动总结报告怎么写
2014/07/03 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
个人党性分析材料
2014/12/19 职场文书
新手,如何业余时间安排好写作、提高写作能力?
2019/10/21 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
在NumPy中深拷贝和浅拷贝相关操作的定义和背后的原理
2022/04/14 Python