簡體   English   中英

GPU中的圖像強度總和

[英]Sum image intensities in GPU

我有一個應用程序,我需要采取圖像的平均強度大約100萬圖像。 它“感覺”就像GPU片段着色器的工作,但片段着色器用於每像素本地計算,而圖像平均是全局操作。

我考慮的一種方法是將圖像加載到紋理中,應用2x2框模糊,將結果加載回N / 2 x N / 2紋理並重復直到輸出為1x1。 但是,這將采用着色器的log n應用程序。

有沒有辦法一次性完成? 或者我應該分解並使用CUDA / OpenCL?

求和操作是“簡化”的特定情況,是CUDA和OpenCL庫中的標准操作。 cuda演示頁面上有一篇很好的文章。 在CUDA中, ThrustCUDPP只是提供減少的兩個庫的例子。 我對OpenCL不太熟悉,但CLPP似乎是一個提供減少的好庫。 只需將顏色緩沖區復制到OpenGL像素緩沖區對象,並使用適當的OpenGL互操作性調用,以便在CUDA / OpenCL中訪問該像素緩沖區的內存。

如果必須使用opengl API(需要原始問題)來完成,解決方案是渲染到紋理,創建紋理的mipmap,並讀入1x1紋理。 你必須設置正確的過濾(雙線性是合適的,我認為),但它應該接近正確的答案,模數精度錯誤。

我的直覺告訴我嘗試在OpenCL中實現。 您可以通過將圖像分解為定制的數據塊然后並行求和來優化圖像大小和圖形硬件。 可能非常快。

片段着色器非常適合卷積,但結果通常寫入gl_FragColor,因此它是有意義的。 最終,您必須遍歷紋理中的每個像素並對結果求和,然后在主程序中讀回。 生成圖像統計信息可能不是片段着色器的設計目的,並且不清楚是否要獲得主要的性能增益,因為它不能保證特定的緩沖區位於GPU內存中。

聽起來您可能正在將此算法應用於實時運動檢測場景或其他一些自動功能檢測應用程序。 從像素樣本而不是整個圖像計算一些統計數據然后構建機器學習分類器可能更快。

無論如何,祝你好運!

如果你想堅持使用GLSL,它不需要CUDA。 就像在這里提到的CUDA解決方案一樣,它可以在片段着色器中向前進行。 但是,您需要關於日志(分辨率)繪制調用。 只需設置一個着色器,從原始圖像中獲取2x2像素樣本,然后輸出它們的平均總和。 結果是兩個軸都具有半分辨率的圖像。 重復此操作直到圖像為1x1像素。 一些注意事項:如果可用,請使用GL_FLOAT亮度紋理,以獲得更精確的總和。 使用glViewport在每個階段對渲染區域進行四分之一。 然后結果會出現在幀緩沖區的左上角像素中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM