2016-03-04 91 views
3

我想在HSV圖像上做Python的2D直方圖,但即使使用numpy和opencv它也不夠快(我實際上是用視頻做的,但考慮每個幀只是一個圖像)。OpenCL中的快速二維直方圖與PyOpenCL

我正在尋找飽和度最高的色相值。目前我有以下代碼,它可以正常工作,但速度太慢。

hist, xbins, ybins = np.histogram2d(hsv_channels[0].ravel(), saturation_channel.ravel(), [180,256],[[0,180],[0,256]]) 

希望與PyOpenCL要做到這一點,而是和推計算的GPU,但除了OpenCL中的世界你好計劃。我發現了一些關於做它們的論文,但我不確定從哪裏開始。

我該如何開始?

編輯:

我已經想過這個多一點。我想,我想要做的GPU上的步驟大致如下:

  1. 打開圖像轉換成一維數組(如果10×10,變成100多頭排列)
  2. 上傳圖像到GPU
  3. 裂像分成n片進行處理,其中n是並行計算單元的數量。或者每個可以引用此數組上的特定範圍。
  4. (地圖)對於每個計算單元,分配180個「分箱」,每個分箱可以包含256個其他分箱。每個內部的最內容只是一個整數用於計數。
  5. 對於每種色調(180個分檔中的一個),計算每個飽和度(其他256個分檔)中該色調的數量。對可以算作的數組的子部分執行此操作。
  6. 創建一個新的空集合。
  7. (Reduce)對於所有這些垃圾桶計數,然後將它們合併(添加值)。我不確定是否需要等到它們全部完成,或者只是按順序與上面的空箱合併。
  8. (確定最終答案)對於最終的一組垃圾箱,循環瀏覽並找到該色相的最大飽和度值,並將其存儲起來。現在找到最大飽和度的色調。作爲最終答案,返回這個色調#和這個最大飽和度#。

儘管如此,我仍然對PyOpenCL(或OpenCL整體)的GPU不太瞭解。

+0

您可以從這裏開始:http://stackoverflow.com/questions/5863979/opencl-image-histogram –

+4

基本問題:什麼是視頻分辨率,以及您需要多快 - 您的幀率定位?此外,你是否需要一個精確的答案,或者是一個近似值,並且具有小的已知誤差界限(例如,最多1%,5%等)是可以接受的? –

+0

假設這是一張1920x1080的圖像。在正確的色調/飽和度值的5%以內的近似值可能是正確的。 – tibbon

回答

6

如果採取不同的方法,您可以將計算時間減少到histogram2d佔用時間的大約2%。在3143x2095圖像上,此方法耗時約5 ms,而histogram2d浪費約280 ms。

import cv2 
import numpy as np 
from numpy import unravel_index 
import time 

img = cv2.imread('ducks.jpg') 

hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) 

print hsv.shape 
hue = hsv[:, :, 0] 
sat = hsv[:, :, 1] 

start = time.time() 
max_index = unravel_index(sat.argmax(), sat.shape) 
end = time.time() 
print 'argmax time:', end - start 
print sat[max_index] 
print hue[max_index] 

start = time.time() 
hist, xbins, ybins = np.histogram2d(hue.ravel(), sat.ravel(), [180, 256], [[0, 180], [0, 256]]) 
end = time.time() 
print 'histogram2d time:', end - start 

輸出:

(2095, 3143, 3) 
argmax time: 0.00526285171509 
255 
39 
histogram2d time: 0.288522958755 

可以很容易地處理具有與最大飽和度值超過一個像素的情況下。

+0

哇,這種方法*方式*的確更快。然而,我認爲它並不像我理想的那樣準確地返回結果。我非常感謝你在這裏得到了什麼,但我想知道是否有一種很好的方法來調整它以完成我所需要的。 – tibbon

+0

沒有什麼是固有的錯誤。你可以上傳一個示例圖像和期望的結果加上沒有得到你想要的代碼。我相信你可以通過這種方式獲得更多的幫助。 – fireant

+0

所以最後,你給我的是實際*完美*! – tibbon