我想在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上的步驟大致如下:
- 打開圖像轉換成一維數組(如果10×10,變成100多頭排列)
- 上傳圖像到GPU
- 裂像分成n片進行處理,其中n是並行計算單元的數量。或者每個可以引用此數組上的特定範圍。
- (地圖)對於每個計算單元,分配180個「分箱」,每個分箱可以包含256個其他分箱。每個內部的最內容只是一個整數用於計數。
- 對於每種色調(180個分檔中的一個),計算每個飽和度(其他256個分檔)中該色調的數量。對可以算作的數組的子部分執行此操作。
- 創建一個新的空集合。
- (Reduce)對於所有這些垃圾桶計數,然後將它們合併(添加值)。我不確定是否需要等到它們全部完成,或者只是按順序與上面的空箱合併。
- (確定最終答案)對於最終的一組垃圾箱,循環瀏覽並找到該色相的最大飽和度值,並將其存儲起來。現在找到最大飽和度的色調。作爲最終答案,返回這個色調#和這個最大飽和度#。
儘管如此,我仍然對PyOpenCL(或OpenCL整體)的GPU不太瞭解。
您可以從這裏開始:http://stackoverflow.com/questions/5863979/opencl-image-histogram –
基本問題:什麼是視頻分辨率,以及您需要多快 - 您的幀率定位?此外,你是否需要一個精確的答案,或者是一個近似值,並且具有小的已知誤差界限(例如,最多1%,5%等)是可以接受的? –
假設這是一張1920x1080的圖像。在正確的色調/飽和度值的5%以內的近似值可能是正確的。 – tibbon