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 sys模块sys.path使用方法示例
Dec 04 Python
python3音乐播放器简单实现代码
Apr 20 Python
Python中模块与包有相同名字的处理方法
May 05 Python
Python配置mysql的教程(推荐)
Oct 13 Python
Python 结巴分词实现关键词抽取分析
Oct 21 Python
python-opencv颜色提取分割方法
Dec 08 Python
python实现二分类的卡方分箱示例
Nov 22 Python
JupyterNotebook设置Python环境的方法步骤
Dec 03 Python
python中设置超时跳过,超时退出的方式
Dec 13 Python
python re模块匹配贪婪和非贪婪模式详解
Feb 11 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
python用Configobj模块读取配置文件
Sep 26 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之面向对象
2013/05/15 PHP
ThinkPHP使用PHPExcel实现Excel数据导入导出完整实例
2014/07/22 PHP
php定时执行任务设置详解
2015/02/06 PHP
php递归函数三种实现方法及如何实现数字累加
2015/08/07 PHP
讲解WordPress开发中一些常用的debug技巧
2015/12/18 PHP
php图像验证码生成代码
2017/06/08 PHP
PHP设计模式之装饰器模式定义与用法详解
2018/04/02 PHP
PHP+MySQL高并发加锁事务处理问题解决方法
2018/04/30 PHP
PHP大文件分块上传功能实例详解
2019/07/22 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
PPK 谈 JavaScript 的 this 关键字 [翻译]
2009/09/29 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
2018/03/21 Javascript
一个手写的vue放大镜效果
2019/08/09 Javascript
Vue.use()在new Vue() 之前使用的原因浅析
2019/08/26 Javascript
40行代码把Vue3的响应式集成进React做状态管理
2020/05/20 Javascript
关于angular浏览器兼容性问题的解决方案
2020/07/26 Javascript
vue addRoutes路由动态加载操作
2020/08/04 Javascript
python通过函数属性实现全局变量的方法
2015/05/16 Python
python实现聊天小程序
2018/03/13 Python
Python实现按中文排序的方法示例
2018/04/25 Python
python 找出list中最大或者最小几个数的索引方法
2018/10/30 Python
Python实现微信自动好友验证,自动回复,发送群聊链接方法
2019/02/21 Python
python字典改变value值方法总结
2019/06/21 Python
Flask框架请求钩子与request请求对象用法实例分析
2019/11/07 Python
keras获得某一层或者某层权重的输出实例
2020/01/24 Python
python3 使用traceback定位异常实例
2020/03/09 Python
简述python&amp;pytorch 随机种子的实现
2020/10/07 Python
信号量和自旋锁的区别?如何选择使用?
2015/09/08 面试题
会计师职业生涯规划范文
2014/02/18 职场文书
求职信怎么写范文
2014/05/26 职场文书
vue+spring boot实现校验码功能
2021/05/27 Vue.js
pytorch 实现多个Dataloader同时训练
2021/05/29 Python
Python jiaba库的使用详解
2021/11/23 Python