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 05 Python
python实现百度语音识别api
Apr 10 Python
Python之列表的插入&amp;替换修改方法
Jun 28 Python
python re正则匹配网页中图片url地址的方法
Dec 20 Python
python tkinter canvas 显示图片的示例
Jun 13 Python
使用Django搭建web服务器的例子(最最正确的方式)
Aug 29 Python
python采集百度搜索结果带有特定URL的链接代码实例
Aug 30 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
Feb 26 Python
深入浅析python 中的self和cls的区别
Jun 20 Python
Python子进程subpocess原理及用法解析
Jul 16 Python
python中np是做什么的
Jul 21 Python
python字符串拼接+和join的区别详解
Dec 03 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表单提交问题的解决方法
2011/04/12 PHP
用PHP读取超大文件的实例代码
2012/04/01 PHP
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
php中url传递中文字符,特殊危险字符的解决方法
2013/08/17 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
ThinkPHP模板比较标签用法详解
2014/06/30 PHP
php用户登录之cookie信息安全分析
2016/05/13 PHP
javascript网页关闭时提醒效果脚本
2008/10/22 Javascript
jQuery 联动日历实现代码
2012/05/31 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
jQuery操作input值的各种方法总结
2013/11/21 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
自己使用jquery写的一个无缝滚动的插件
2014/04/30 Javascript
Bootstrap 网格系统布局详解
2017/03/19 Javascript
从零开始学习Node.js系列教程六:EventEmitter发送和接收事件的方法示例
2017/04/13 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
layui实现文件或图片上传记录
2018/08/28 Javascript
webpack优化的深入理解
2018/12/10 Javascript
Python实现计算文件夹下.h和.cpp文件的总行数
2015/04/23 Python
Python FTP两个文件夹间的同步实例代码
2018/05/25 Python
python画微信表情符的实例代码
2019/10/09 Python
python实现自动化报表功能(Oracle/plsql/Excel/多线程)
2019/12/02 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
Python自省及反射原理实例详解
2020/07/06 Python
如何用Python绘制3D柱形图
2020/09/16 Python
Python ellipsis 的用法详解
2020/11/20 Python
[原创]赚疯了!转手立赚800+?大佬的python「抢茅台脚本」使用教程
2021/01/12 Python
澳大利亚当地社区首选的光学商店:1001 Optical
2019/08/24 全球购物
大学生怎样进行自我评价
2013/12/07 职场文书
优秀企业获奖感言
2014/02/01 职场文书
黄河的主人教学反思
2014/02/07 职场文书
《草原》教学反思
2014/02/15 职场文书
青春励志演讲稿
2014/04/29 职场文书
社区健康教育工作方案
2014/06/03 职场文书
create-react-app开发常用配置教程
2022/06/25 Javascript