2017-05-24 67 views
1

對於一個有趣的項目,我想分析一些圖像,尤其是哪些顏色(色調)比其他顏色更明顯。由於我想要考慮顏色的「可見度」,因此只需計算像素的色調是不夠的(例如,完美的黑色會計爲紅色,因爲其色調爲0°)。我想出了一個適合我的項目的IMO公式。從圖像numpy數組中關於飽和度和值的色調值計算顏色可見度

目前我執行以下操作:

  • 與OpenCV中讀出的圖像(在BGR numpy的陣列結果)
  • 轉換圖像以HSV
  • 對於每個像素,計算其色調的可見性(從飽和度和值),並在一個色調的字典中加以總結。

該公式是​​。因此,全紅RGB=255,0,0; HSV=0,1,1會導致1,而例如,淺紅色RGB=255,128,128; HSV=0,0.5,1將導致0.70

這裏是(完整的工作)的代碼,我使用:

import urllib 
import cv2 
import numpy as np 

url = 'https://upload.wikimedia.org/wikipedia/commons/thumb/0/02/Leuchtturm_in_Westerheversand_crop.jpg/299px-Leuchtturm_in_Westerheversand_crop.jpg' 
image = np.asarray(bytearray(urllib.urlopen(url).read()), dtype="uint8") 
image = cv2.imdecode(image, cv2.IMREAD_COLOR) 

d = {} 
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) 
pixels = hsv.reshape((hsv.shape[0] * hsv.shape[1], 3)) 
for h,s,v in pixels: 
    d[h] = d.get(h, 0.) + (s/255. * v/255.) ** 0.5 

正如你可能已經猜到,代碼得到真正當圖像具有更多的像素放緩。

我的問題是,如何在沒有字典和for-loop的情況下計算我的公式?也許直接與numpy?

回答

1

你正在尋找神奇的是在np.bincount,因爲它使用h值作爲箱轉換相當平直向前到糊塗的版本 -

H,S,V = pixels.T 
d_arr = np.bincount(H, ((S/255.0) * (V/255.0))**0.5) 

注意,合成陣列可能有元素具有零價值計數

+0

謝謝,是的,我是新來的numpy,不知道要搜索什麼。非常感謝:) – sphere

+0

@sphere應該提到'bincount'超級快。所以,要準備好被吹走:) – Divakar

+0

事實上,一切都與numpy。即使在閱讀'bincount'的文檔後,我也不會知道它可以像這樣使用... – sphere

相關問題