更新:优化了代码,理由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]
以上这篇python下对hsv颜色空间进行量化操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- PatriciaPaay-Playmate(ExpandedEditionRemastered2024)[24Bit-96kHz]FLAC
- 蒋志光韦绮姗.2014-传奇巨声【环星】【WAV+CUE】
- 关淑怡.2008-演唱会+无尽经典3CD【环球】【WAV+CUE】
- 伍佰.2002-冬之火九重天演唱会特选录音专辑2CD【滚石】【WAV+CUE】
- 李宗盛1996《李宗盛的凡人歌2CD》滚石[WAV+CUE][1G]
- 刘德华 《天意》1:1直刻黑胶LPCD[WAV+CUE][1.1G]
- 刘德丽2024《赤的疑惑HQCD》头版限量编号MQA[低速原抓WAV+CUE]
- 英雄联盟万圣节有什么皮肤返场 2024万圣节皮肤返场一览
- lol万圣节赠礼活动什么时候开始 2024万圣节活动时间介绍
- 2024全球总决赛blg是全华班吗 全球总决赛blg选手所属国家介绍
- 《LOL》S14半决赛:T1战胜GEN晋级决赛!对决BLG
- 《完蛋美女前传》白白演员抱怨:都没人玩我的线
- 玩家热议OLED屏对画面提升巨大:比PS5 Pro值得买
- PatriciaPaay-TheLadyIsAChamp(ExpandedEdition)(2024)[24Bit-96kHz]FLAC
- 尚士达.2024-莫回头【智慧小狗】【DTS-WAV分轨】