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 生成目录树及显示文件大小的代码
Jul 23 Python
python算法学习之基数排序实例
Dec 18 Python
python基于urllib实现按照百度音乐分类下载mp3的方法
May 25 Python
python函数中return后的语句一定不会执行吗?
Jul 06 Python
python中利用Future对象回调别的函数示例代码
Sep 07 Python
python实现全盘扫描搜索功能的方法
Feb 14 Python
Python matplotlib生成图片背景透明的示例代码
Aug 30 Python
浅析PEP572: 海象运算符
Oct 15 Python
Python Selenium安装及环境配置的实现
Mar 17 Python
Python绘制全球疫情变化地图的实例代码
Apr 20 Python
python根据完整路径获得盘名/路径名/文件名/文件扩展名的方法
Apr 22 Python
Opencv+Python识别PCB板图片的步骤
Jan 07 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原理之错误抑制与内嵌HTML分析
2011/05/02 PHP
使用PHP实现Mysql读写分离
2013/06/28 PHP
PHP实现图片自动清理的方法
2015/07/08 PHP
php+mongodb判断坐标是否在指定多边形区域内的实例
2016/10/28 PHP
用js来获取上传的文件名纯粹是为了美化而用
2013/10/23 Javascript
Node.js中使用计时器定时执行函数详解
2014/08/15 Javascript
js判断手机和pc端选择不同执行事件的方法
2015/01/30 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
Javascript实现苹果悬浮虚拟按钮
2016/04/10 Javascript
JS中数组重排序方法
2016/11/11 Javascript
AngularJS select加载数据选中默认值的方法
2018/02/28 Javascript
在vue中封装可复用的组件方法
2018/03/01 Javascript
微信小程序实现跑马灯效果
2020/10/21 Javascript
Vue中通过vue-router实现命名视图的问题
2020/04/23 Javascript
js+css实现扇形导航效果
2020/08/18 Javascript
[01:48]帕吉至宝加入游戏,遗迹战场现“千劫神屠”
2018/04/07 DOTA
Python字符和字符值(ASCII或Unicode码值)转换方法
2015/05/21 Python
Python利用字典将两个通讯录文本合并为一个文本实例
2018/01/16 Python
Python爬虫动态ip代理防止被封的方法
2019/07/07 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
python正则表达式的懒惰匹配和贪婪匹配说明
2020/07/13 Python
H5仿微信界面教程(一)
2017/07/05 HTML / CSS
戴森台湾线上商城:Dyson Taiwan
2018/05/21 全球购物
性能服装:HYLETE
2018/08/14 全球购物
机械专业应届生求职信
2013/09/21 职场文书
应届专科生个人的自我评价
2014/01/05 职场文书
财务部副经理岗位职责
2014/03/14 职场文书
寄语是什么意思
2014/04/10 职场文书
教师年度考核评语
2014/04/28 职场文书
市级优秀班主任事迹材料
2014/05/13 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
2015年机关党委工作总结
2015/05/23 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang
Win11 KB5015814遇安装失败 影响开始菜单性能解决方法
2022/07/15 数码科技