python下对hsv颜色空间进行量化操作
作者:MoonBreeze_Ma 发布时间:2022-11-22 01:56:12
更新:优化了代码,理由numpy的ufunc函数功能替换了之前的双重for循环,测试图片大小为692*1024*3,优化前运行时间为6.9s,优化后为0.8s。
由于工作需要,需要计算颜色直方图来提取颜色特征,但若不将颜色空间进行量化,则直方图矢量维数过高,不便于使用。但是看了opencv API后并未发现提供了相关函数能够在计算颜色直方图的同时进行量化,因此这部分功能只能自己实现。下面分为两个部分进行介绍:
一、颜色空间量化表
由于RGB模型不够直观,不符合人类视觉习惯,因此在进行颜色特征提取前,需要将照片从RGB颜色模型转换为更符合人类视觉的HSV模型。在提取颜色特征时,最常用的方法之一为颜色直方图法,但一张图片中出现的颜色一般特别多,导致直方图矢量的维数较高,因此需要对HSV空间进行量化。根据人眼对颜色的感知特性,采用较为常用的量化方法,即按照如下对应关系进行量化:
基于上述量化表,将各颜色分量按照下述公式合成为72维一维矢量:
二、量化代码
代码使用纯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]
来源:https://blog.csdn.net/qq_23926575/article/details/80139071
猜你喜欢
- 以下是通过Excel 的VBA连接Oracle并操作Oracle相关数据的示例Excel 通过VBA连接数据库需要安装相应的Oracle客户
- 前言:Python 中的画图工具——turtle(海龟绘图),turtle 是 Python 中自带
- 简单方法实现网页自动适应任何分辨率任何窗口大小(只适用于IE)<!DOCTYPE html PUBLIC "-//W3C//
- 本文实例讲述了Python基于正则表达式实现检查文件内容的方法分享给大家供大家参考,具体如下:这个是之前就在学python,欣赏python
- 在数据分析中经常需要从csv格式的文件中存取数据以及将数据写书到csv文件中。将csv文件中的数据直接读取为 dict 类型和 DataFr
- 前言Python中使用SSH需要用到OpenSSH,而OpenSSH依赖于paramiko模块,而paramiko模块又依赖于pycrypt
- 本节为读者讲解如何利用ADO.NET本身的参数对象和存储过程技术防止注入攻击,以达到用户界面输入与原始SQL的分离,使黑客无法拼接SQL语句
- 1.requiremwnts:Django版本:2.2python版本:3.6djangorestframework版本:3.1django
- 本篇文章是作者关于在学习了《Python学习手册》以后,分享的学习心得,在此之前,我们先给大家分享一下这本书:下载地址:Python学习手册
- 在进行matplotlib画图的时候,经常会出现这个的报错,虽然知道是因为没有对应的字体的原因,但是,将字体下载后放到目标路径下,仍然没有办
- 1、基本原理访问网站扫码登录页,网站给浏览器返回一个二维码和一个唯一标志KEY浏览器开启定时轮询服务器,确认KEY对应的扫码结果用户使用ap
- iframe 标签 -- 代表HTML内联框架iframe 标签是成对出现的,以<iframe>开始,</ifr
- 测试平台 Ubuntu 13.04 X86_64 Python 2.7.4花了将近两个小时, 问题主要刚开始没有想到传一个文件对象到线程里面
- 在HTML中,我们设置border=”1″ 时,表格边框实际大小是2px,那如果我们要做成1px的细线表格要怎么办?以前在做1px的表格的时
- 获取带有中文参数的url内容对于中文的参数如果不进行编码的话,python的urllib2直接处理会报错,我们可以先将中文转换成utf- 8
- 目录1 、一般同步下载2、 使用流式请求,requests.get方法的stream3 、异步下载文件4、 异步拆分下载文件5、注意1 、一
- 本文实例讲述了Go语言通过Luhn算法验证信用卡卡号是否有效的方法。分享给大家供大家参考。具体实现方法如下:package mainimpo
- 1. 线性表简介线性表是一种线性结构,它是由零个或多个数据元素构成的有限序列。线性表的特征是在一个序列中,除了头尾元素,每个元素都有且只有一
- 数据库复制:简单来说,数据库复制就是由两台服务器,主服务器和备份服务器,主服务器修改后,备份服务器自动修改。复制的模式有两种:推送模式和请求
- step1:在file中找到default settingsstep2:找到Project Interpreterstep3:按照如图步骤搜