2013-07-19 59 views
1

我試圖在CUDA中實現最大性能Circle Hough變換,藉此邊緣像素座標在Hough空間中投票。紅隧僞代碼如下,我使用的256×256像素的圖像大小:CUDA實現Circle Hough變換

int maxRadius = 100; 
int minRadius = 20; 
int imageWidth = 256; 
int imageHeight = 256; 

int houghSpace[imageWidth x imageHeight * maxRadius]; 

for(int radius = minRadius; radius < maxRadius; ++radius) 
{ 
    for(float theta = 0.0; theta < 180.0; ++theta) 
    { 
     xCenter = edgeCoordinateX + (radius * cos(theta)); 
     yCenter = edgeCoordinateY + (radius * sin(theta)); 

     houghSpace[xCenter, yCenter, radius] += 1; 
    } 
} 

我的基本想法是讓每個線程塊計算輸出霍夫空間的(小)瓦(也許輸出霍夫空間的每一行一個塊)。因此,我需要以某種方式將輸入圖像的所需部分分配到共享存儲器中,以便在特定的輸出子空間中執行投票。

我的問題如下:

  1. 如何計算和存儲的座標爲共享內存中輸入圖像所需的部分?

  2. 如何檢索以前存儲在共享內存中的邊緣像素的x,y座標?

  3. 我是否可以在另一個共享內存陣列中投票或將投票直接寫入全局內存?

謝謝大家爲你準備的時間。我是CUDA的新手,任何與此有關的幫助都會非常感激。

+0

請修復你的代碼中的語法錯誤 – RoBiK

+0

你在這裏問我們的是爲你工作。我建議你這兩個讀數,你可以自己回答。 1:http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html 2:http://docs.nvidia.com/cuda/cuda-c-best-practices-guide /index.html – KiaMorot

+0

RoBiK - 這是僞代碼,只是爲了說明問題。 –

回答

3

我並不知道對這種過濾有太多的瞭解,但從源頭傳播特徵的基本思想聽起來與行進和掃描方法不同,它不能解決固定的Eikonal方程。有關於解決這類問題的非常好的論文(PDF可能仍然可用here):

Eikonal方程的快速迭代法。 Won-Ki Jeong,Ross T. Whitaker。 SIAM雜誌上的科學計算,第30卷第5期, pp.2512-2534,2008年

的基本思想是分解計算域爲瓦片和掃描來自全國各地的域源的特點。隨着瓷磚被前進特徵觸及,它們被添加到活動瓷磚列表並計算。每次瓦片「解決」(收斂到Eikonal情況下的數值容差,可能是問題中的一個狀態),瓦片將從工作集中退出,並且其鄰居被激活。如果再次觸摸磁貼,它會重新添加到活動列表中。該過程繼續進行,直到所有圖塊被計算並且活動列表爲空。每個計算迭代都可以通過內核啓動來解決,該啓動明確地同步計算。根據需要運行儘可能多的內核來獲得空的工作列表。

我不認爲值得試圖回答你的問題,直到你有一個更具體的算法的方法,並進入實施細節。

+0

+1爲您的非常好的答案。你提到的方法也被稱爲「快速前進」,並且在很久以前,我已經讀過它也用於圖像分割和處理。 – JackOLantern

+0

是的,你是對的。 「快速迭代法」比「快速推進法」更加平行,嚴格來說,它們是不同的算法。 – JackOLantern