文章目录

  • 一、颜色空间量化表
  • 二、量化代码
  • 三、更新

更新:优化了代码,理由numpy的ufunc函数功能替换了之前的双重for循环,测试图片大小为69210243,优化前运行时间为6.9s,优化后为0.8s。

由于工作需要,需要计算颜色直方图来提取颜色特征,但若不将颜色空间进行量化,则直方图矢量维数过高,不便于使用。但是看了opencv API后并未发现提供了相关函数能够在计算颜色直方图的同时进行量化,因此这部分功能只能自己实现。下面分为两个部分进行介绍:

一、颜色空间量化表

由于RGB模型不够直观,不符合人类视觉习惯,因此在进行颜色特征提取前,需要将照片从RGB颜色模型转换为更符合人类视觉的HSV模型。在提取颜色特征时,最常用的方法之一为颜色直方图法,但一张图片中出现的颜色一般特别多,导致直方图矢量的维数较高,因此需要对HSV空间进行量化。根据人眼对颜色的感知特性,采用较为常用的量化方法,即按照如下对应关系进行量化:

基于上述量化表,将各颜色分量按照下述公式合成为72维一维矢量: G = 9 H + 3 S + V G = 9H + 3S + V G=9H+3S+V

二、量化代码

代码使用纯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 pltdef 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() - t2hist = cv2.calcHist([nhsv], [0], None, [72], [0,71]) # 40x faster than np.histogramfaster than np.histogramplt.plot(hist,color = 'r')plt.xlim([0, 72])plt.show()def quantilize(value):'''hsv直方图量化value : [21, 144, 23] h, s, vopencv中,h-[0,180], s-[0,255], v-[0,255]'''# value[0] = value[0] * 2hlist = [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 % 8breakfor i in range(len(svlist)):if value[1] <= svlist[i]:s = ibreakfor i in range(len(svlist)):if value[2] <= svlist[i]:v = ibreakreturn 9 * h + 3 * s + v

以上,欢迎批评交流~
如果觉得不错,欢迎点赞~


三、更新

#-*-coding:utf-8-*-
import cv2
import numpy as np
from datetime import datetime
from matplotlib import pyplot as plthlist = [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, vh = h * 2for i in range(len(hlist)):if h <= hlist[i]:h = i % 8breakfor i in range(len(svlist)):if s <= svlist[i]:s = ibreakfor i in range(len(svlist)):if v <= svlist[i]:v = ibreakreturn 9 * h + 3 * s + vquantilize_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.histogramhist = hist.reshape(1, hist.shape[0]).astype(np.int32).tolist()[0]return histif __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颜色空间进行量化相关推荐

  1. python rgb转hsv_使用Python / PIL检测HSV颜色空间(来自RGB)的阈...

    好的,这确实有效(修复了一些溢出错误): import numpy, Image i = Image.open(fp).convert('RGB') a = numpy.asarray(i, int) ...

  2. Python+Opencv简易车牌识别(二):形态学运算,HSV颜色空间筛选与图像分割

    注:这是依然一个简单的车牌识别demo 1.前言 在上一篇Python+Opencv简易车牌识别(一):基于HSV颜色空间的图像分割中,我们讲了如何仅基于颜色来进行简单粗暴的车牌分割.今天我们考虑对图 ...

  3. python中使用opencv的HSV颜色空间提取物体

    HSV H:hue 色相(0-360),红绿蓝 S:saturation饱和度(0-100),形容颜色的深浅,如浅红.大红.深红 V:value色调(0-100),色彩的亮度 但是HSV颜色空间却规定 ...

  4. OpenCV Using Python——HSV颜色空间和改进的YCbCr颜色空间中的肤色检测

    HSV颜色空间中的肤色检测 1. HSV颜色空间的肤色模型简介 Pitas等人提出在HSV空间建立肤色模型.不要求颜色归一化并且对光照鲁棒性很强,条件同时满足才会被分割成皮肤.实现条件如下: 2. 实 ...

  5. 数字图像处理与Python实现-颜色空间转换-RGB颜色空间与HSV颜色空间转换

    RGB颜色空间与HSV颜色空间转换 RGB颜色空间与HSV颜色空间转换 1. 前言 2. RGB颜色空间与HSV颜色空间转换描述 3. 代码实现 1. 前言 HSV(Hue, Saturation, ...

  6. 使用Python,OpenCV转换颜色空间,追踪对象的轨迹

    使用Python,OpenCV转换颜色空间,追踪对象的轨迹 1. 效果图 2. 源码 参考 这篇博客可以看作是之前俩篇博客的融合,将介绍如何使用Python,OpenCV转换颜色空间,并利用HSV追踪 ...

  7. 六、HSV颜色空间应用实例——颜色分割提取与替换

    教程汇总:python基础入门系列 通过之前的章节(四.OpenCV颜色空间--HSV颜色模型),我们已经初步认识了HSV颜色空间的特性与优势,现在就来看两个典型的应用实例,颜色分割提取 与 颜色替换 ...

  8. 基于HSV颜色空间用OpenCV-Python给照片换底

    ☞ ░ 前往老猿Python博文目录 https://blog.csdn.net/LaoYuanPython ░ 一.引言 在<基于RGB颜色空间用OpenCV-Python给蓝底照片换底> ...

  9. 关于HSL和HSV颜色空间的详细论述

    目前在计算机视觉领域存在着较多类型的颜色空间(color space).HSL和HSV是两种最常见的圆柱坐标表示的颜色模型,它重新影射了RGB模型,从而能够视觉上比RGB模型更具有视觉直观性. HSV ...

最新文章

  1. 【ADO.NET】2、各种版本的 简单登录验证
  2. TypeError: Class advice impossible in Python3. Use the @Implementer class decorator instead
  3. 高通平台Tag精确寻找进阶教程
  4. Redis 持久化(persistence)
  5. LeetCode5382. HTML 实体解析器
  6. 浣溪沙·过杜甫草堂有感
  7. SQL 单一用户(解决)
  8. python已知有列表_python 列表常用方法
  9. ncnn arm linux,arm ncnn
  10. 软件测试学生管理系统课程设计,软件测试课程设计-ERP进销存管理系统(1)
  11. VC输出调用出错信息
  12. (转)AIX rootvg 镜像创建与磁盘更换
  13. C语言scanf跳出循环的问题
  14. Design and Model Analysis of the E-Commerce Development Platform for 3-Tiered Web Applications
  15. python机器人仿真软件_RoboDK(机器人仿真软件)软件下载_RoboDK(机器人仿真软件)v4.2.3 官方版 - Windows10系统之家...
  16. 惠普服务器故障代码_惠普服务器常见问题及故障排除
  17. 微软Exchange Server 0Day漏洞,尽快修复
  18. win10 手动设置 DNS 地址
  19. HTTP的options方法作用
  20. vue打包之后浏览器图标设置直接没有输出,vue打包之后浏览器图标不显示

热门文章

  1. “我们无法设置移动热点” 解决方案
  2. Linux文件的rwx含义,Linux文件权限rwx简单了解
  3. Javascript 检测网速
  4. 大头报文_20种具有创意的“大头”照片操作
  5. python爬虫自学网站_python爬虫学习 爬取幽默笑话网站
  6. ubuntu 16.04与win7双系统安装图解
  7. java 装箱与拆箱_java中的装箱与拆箱
  8. Git 配置 user 信息
  9. 1.简单理解入门k8s
  10. torch.arange() 与 torch.range()