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实现在每个独立进程中运行一个函数的方法
Apr 23 Python
Python简单计算文件夹大小的方法
Jul 14 Python
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
基于Python Numpy的数组array和矩阵matrix详解
Apr 04 Python
详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击
Oct 09 Python
python使用Plotly绘图工具绘制柱状图
Apr 01 Python
python实现生成Word、docx文件的方法分析
Aug 30 Python
修改Pandas的行或列的名字(重命名)
Dec 18 Python
Python多线程threading join和守护线程setDeamon原理详解
Mar 18 Python
jupyter notebook 增加kernel教程
Apr 10 Python
python 识别登录验证码图片功能的实现代码(完整代码)
Jul 03 Python
Python基于正则表达式实现计算器功能
Jul 13 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面向对象全攻略 (八)重载新的方法
2009/09/30 PHP
php变量范围介绍
2012/10/15 PHP
phpmailer在服务器上不能正常发送邮件的解决办法
2014/07/08 PHP
PHP使用json_encode函数时不转义中文的解决方法
2014/11/12 PHP
PHP实现懒加载的方法
2015/03/07 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
PhpStorm的使用教程(本地运行PHP+远程开发+快捷键)
2020/03/26 PHP
IE innerHTML,outerHTML所引起的问题
2009/06/04 Javascript
jQuery生成asp.net服务器控件的代码
2010/02/04 Javascript
jQuery异步获取json数据方法汇总
2014/12/22 Javascript
JS组件Bootstrap实现弹出框效果代码
2016/04/26 Javascript
VSCode 配置React Native开发环境的方法
2017/12/27 Javascript
js中this对象用法分析
2018/01/05 Javascript
react-router v4如何使用history控制路由跳转详解
2018/01/09 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
深入浅析Vue.js计算属性和侦听器
2018/05/05 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
使用proxy实现一个更优雅的vue【推荐】
2018/06/19 Javascript
jQuery 常用特效实例小结【显示与隐藏、淡入淡出、滑动、动画等】
2020/05/19 jQuery
js实现双人五子棋小游戏
2020/05/28 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
Python3.x和Python2.x的区别介绍
2013/02/12 Python
python实现简单遗传算法
2018/03/19 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
Python Socket编程之多线程聊天室
2018/07/28 Python
浅析python参数的知识点
2018/12/10 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
为什么说python更适合树莓派编程
2020/07/20 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
某个公司的Java笔面试题
2016/03/11 面试题
《台湾的蝴蝶谷》教学反思
2014/02/20 职场文书
组织鉴定材料
2014/06/02 职场文书
企业趣味活动方案
2014/08/21 职场文书
医院员工辞职信范文
2015/05/12 职场文书
python解决12306登录验证码的实现
2021/04/18 Python