python下對hsv顏色空間進行量化

2021-08-19 13:24:49 字數 3506 閱讀 1816

由於工作需要,需要計算顏色直方圖來提取顏色特徵,但若不將顏色空間進行量化,則直方圖向量維數過高,不便於使用。但是看了opencv api後並未發現提供了相關函式能夠在計算顏色直方圖的同時進行量化,因此這部分功能只能自己實現。下面分為兩個部分進行介紹:

由於rgb模型不夠直觀,不符合人類視覺習慣,因此在進行顏色特徵提取前,需要將**從rgb顏色模型轉換為更符合人類視覺的hsv模型。在提取顏色特徵時,最常用的方法之一為顏色直方圖法,但一張中出現的顏色一般特別多,導致直方圖向量的維數較高,因此需要對hsv空間進行量化。根據人眼對顏色的感知特性,採用較為常用的量化方法,即按照如下對應關係進行量化:

基於上述量化表,將各顏色分量按照下述公式合成為72維一維向量:g=

9h+3

s+v g=9

h+3s

+v

#-*-coding:utf-8-*-

import cv2

import numpy as np

from datetime import datetime

from matplotlib import pyplot as plt

defcolors

(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()

defquantilize

(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]

defquantilize

(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個。

defcolors

(img):

hsv = cv2.cvtcolor(img, cv2.color_rgb2hsv)

nhsv = quantilize_ufunc(hsv[:,:,0], hsv[:,:,1], hsv[:,:,2]).astype(np.uint8) # 由於frompyfunc函式返回結果為物件,所以需要轉換型別

結果

[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]

HSV顏色空間

hsv hue,saturation,value 是根據顏色的直觀特性由a.r.smith在1978年建立的一種顏色空間,也稱六角錐體模型 hexcone model 這個模型中顏色的引數分別是 色調 h 飽和度 s 亮度 v hsv顏色空間模型 1 色調h 用角度度量,取值範圍為0 360 從紅色...

HSV顏色空間

h引數表示色彩資訊,即所處的光譜顏色的位置。該引數用一角度量來表示,紅 綠 藍分別相隔120度。互補色分別相差180度。純度s為一比例值,範圍從0到1,它表示成所選顏色的純度和該顏色最大的純度之間的比率。s 0時,只有灰度。v表示色彩的明亮程度,範圍從0到1。有一點要注意 它和光強度之間並沒有直接的...

HSV顏色空間

hsv hue,saturation,value 顏色空間的模型對應於圓柱座標系中的乙個圓錐形子集,圓錐的頂面對應於v 1。它包含rgb模型中的 r 1,g 1,b 1三個面,所代表的顏色較亮。色彩h由繞v軸的旋轉角給定。紅色對應於角度0 綠色對應於角度120 藍色對應於角度240 在hsv顏色模型...