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的Django框架环境并建立和运行第一个App的教程
Jul 02 Python
python利用拉链法实现字典方法示例
Mar 25 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
详解Python3 基本数据类型
Apr 19 Python
python实现鸢尾花三种聚类算法(K-means,AGNES,DBScan)
Jun 27 Python
pip 安装库比较慢的解决方法(国内镜像)
Oct 06 Python
Python:type、object、class与内置类型实例
Dec 25 Python
使用opencv识别图像红色区域,并输出红色区域中心点坐标
Jun 02 Python
Python离线安装各种库及pip的方法
Nov 28 Python
python爬虫 requests-html的使用
Nov 30 Python
python实现xml转json文件的示例代码
Dec 30 Python
Python Django 后台管理之后台模型属性详解
Apr 25 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中CURL的CURLOPT_POSTFIELDS参数使用细节
2014/03/17 PHP
ThinkPHP CURD方法之field方法详解
2014/06/18 PHP
ThinkPHP3.2框架使用addAll()批量插入数据的方法
2017/03/16 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
提高Laravel应用性能方法详解
2019/06/24 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
用js实现计算加载页面所用的时间
2010/04/02 Javascript
innerHTML 和 getElementsByName 在IE下面的bug 的解决
2010/04/09 Javascript
Array, Array Constructor, for in loop, typeof, instanceOf
2011/09/13 Javascript
弹出层之1:JQuery.Boxy (一) 使用介绍
2011/10/06 Javascript
js数字转换为float,取N位小数
2014/02/08 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
在JavaScript中处理时间之setMinutes()方法的使用
2015/06/11 Javascript
JavaScript中关于class的调用方法
2017/11/28 Javascript
在vue中通过axios异步使用echarts的方法
2018/01/13 Javascript
angularjs通过过滤器返回超链接的方法
2018/10/26 Javascript
初探Vue3.0 中的一大亮点Proxy的使用
2018/12/06 Javascript
react-router4按需加载(踩坑填坑)
2019/01/06 Javascript
微信小程序自定义单项选择器样式
2019/07/25 Javascript
详解Vue3.0 + TypeScript + Vite初体验
2021/02/22 Vue.js
[20:21]《一刀刀一天》第十六期:TI国际邀请赛正式打响,总奖金超过550万
2014/05/23 DOTA
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
Python while 循环使用的简单实例
2016/06/08 Python
Python selenium实现微博自动登录的示例代码
2018/05/16 Python
Python统计文本词汇出现次数的实例代码
2020/02/27 Python
HTML5中实现拖放效果无须借助javascript
2012/12/26 HTML / CSS
DHC美国官网:日本通信销售第一的化妆品品牌
2017/11/12 全球购物
NFL加拿大官方网上商店:NHLShop.ca
2019/03/12 全球购物
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
会计电算化专业应届大学生求职信
2013/10/22 职场文书
小学生成绩单评语
2014/12/31 职场文书
高校自主招生自荐信2015
2015/03/04 职场文书
试用期工作表现自我评价
2015/03/06 职场文书
ROS系统将python包编译为可执行文件的简单步骤
2021/07/25 Python
python数据可视化JupyterLab实用扩展程序Mito
2021/11/20 Python
Windows 11要来了?微软文档揭示Win11太阳谷 / Win10有两个不同版本
2021/11/21 数码科技