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空间进行量化。根据人眼对颜色的感知特性,采用较为常用的量化方法,即按照如下对应关系进行量化:

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]

来源:https://blog.csdn.net/qq_23926575/article/details/80139071

标签:python,hsv,颜色空间,量化
0
投稿

猜你喜欢

  • pyqt5 从本地选择图片 并显示在label上的实例

    2022-12-12 17:48:04
  • Pycharm安装scrapy及初始化爬虫项目的完整步骤

    2023-04-03 10:49:43
  • Vue 实现穿梭框功能的详细代码

    2024-05-09 10:51:53
  • vue中el-table格式化el-table-column内容的三种方法

    2024-04-27 16:10:39
  • pycharm将英文设置为中文的详细教程

    2022-07-16 14:22:24
  • Python 中导入csv数据的三种方法

    2022-02-24 10:12:10
  • Python socket套接字实现C/S模式远程命令执行功能案例

    2021-11-27 13:22:01
  • PHP 二维数组根据某个字段排序的具体实现

    2023-11-20 05:21:13
  • Keras之fit_generator与train_on_batch用法

    2021-07-10 18:19:31
  • python字符串常用方法及文件简单读写的操作方法

    2023-11-24 10:20:04
  • Java实现基于JDBC操作mysql数据库的方法

    2024-01-27 04:54:17
  • 利用JavaScript实现防抖节流函数的示例代码

    2024-05-11 09:31:55
  • SQLServer触发器创建、删除、修改、查看示例代码

    2024-01-22 16:33:03
  • vue+elementui+vuex+sessionStorage实现历史标签菜单的示例代码

    2024-04-30 10:26:30
  • javascript 词法作用域和闭包分析说明

    2024-04-17 09:56:42
  • 下载golang.org/x包的操作方法

    2023-07-11 16:54:04
  • golang判断net.Conn 是否已关闭的操作

    2024-04-30 10:07:02
  • 运筹学-Python实现图论与最短距离

    2022-10-24 05:58:59
  • 解析PHP中empty is_null和isset的测试

    2023-11-18 17:39:06
  • python实现矩阵打印

    2023-04-27 06:34:30
  • asp之家 网络编程 m.aspxhome.com