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中for循环的使用方法
May 14 Python
python插入排序算法实例分析
Jul 03 Python
OpenCV实现人脸识别
Apr 07 Python
Django在win10下的安装并创建工程
Nov 20 Python
Python排序搜索基本算法之冒泡排序实例分析
Dec 09 Python
python简易实现任意位数的水仙花实例
Nov 13 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
Python简单I/O操作示例
Mar 18 Python
通过pycharm使用git的步骤(图文详解)
Jun 13 Python
Python计算一个点到所有点的欧式距离实现方法
Jul 04 Python
python正则表达式匹配IP代码实例
Dec 28 Python
Python函数式编程实例详解
Jan 17 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多文件上传实现代码
2014/02/20 PHP
用PHP解决的一个栈的面试题
2014/07/02 PHP
微信封装的调用微信签名包的类库
2017/06/08 PHP
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
javascript 实现子父窗体互相传值的简单实例
2014/02/17 Javascript
Javascript实现检测客户端类型代码封包
2015/12/03 Javascript
JavaScript实现图片自动加载的瀑布流效果
2016/04/11 Javascript
jQuery通过写入cookie实现更换网页背景的方法
2016/04/15 Javascript
JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
2016/11/10 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
为JQuery EasyUI 表单组件增加焦点切换功能的方法
2017/04/13 jQuery
JS中用EL表达式获取上下文参数值的方法
2018/03/28 Javascript
vue+echarts实现动态绘制图表及异步加载数据的方法
2018/10/17 Javascript
微信小程序自定义toast的实现代码
2018/11/16 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
vue中利用simplemde实现markdown编辑器(增加图片上传功能)
2019/04/29 Javascript
微信小程序如何引用外部js,外部样式,公共页面模板
2019/07/23 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
2020/03/11 Javascript
vue 使用vant插件做tabs切换和无限加载功能的实现
2020/11/04 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
python 计算数组中每个数字出现多少次--“Bucket”桶的思想
2017/12/19 Python
Django中数据库的数据关系:一对一,一对多,多对多
2018/10/21 Python
python程序控制NAO机器人行走
2019/04/29 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
Pandas中resample方法详解
2019/07/02 Python
调试Django时打印SQL语句的日志代码实例
2019/09/12 Python
python第三方库学习笔记
2020/02/07 Python
Python实现PS滤镜中的USM锐化效果
2020/12/04 Python
校园广播稿精选
2014/10/01 职场文书
自荐信格式模板
2015/03/27 职场文书
销售开票员岗位职责
2015/04/15 职场文书
我在伊朗长大观后感
2015/06/16 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
SQL Server——索引+基于单表的数据插入与简单查询【1】
2021/04/05 SQL Server
海贼王十大潜力果实,路飞仅排第十,第一可毁世界(震震果实)
2022/03/18 日漫