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?
謝謝,是的,我是新來的numpy,不知道要搜索什麼。非常感謝:) – sphere
@sphere應該提到'bincount'超級快。所以,要準備好被吹走:) – Divakar
事實上,一切都與numpy。即使在閱讀'bincount'的文檔後,我也不會知道它可以像這樣使用... – sphere