2013-07-19 3 views
1

Я пытаюсь реализовать максимальную производительность Circle Hough Transform в CUDA, благодаря чему пиксельные координаты края подают голоса в пространстве hough. Псевдо код СНТ выглядит следующим образом, я использую размеры изображения от 256 х 256 пикселей:CUDA реализация Circle Hough Transform

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; 
    } 
} 

Моя основная идея заключается в том, чтобы каждый блок нить вычислить (небольшой) плитку выходного Hough пространства (возможно, один блок для каждой строки выходного пространства hough). Поэтому мне нужно каким-то образом получить требуемую часть входного изображения в разделяемую память, чтобы провести голосование в определенном пространстве суб-хау.

Мои вопросы заключаются в следующем:

  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

Я не утверждаю, что много знаю об этом виде фильтрации, но основная идея распространения характеристик из источника не слишком отличается от маршевых и подметающих методов решения стационарного уравнения Эйконала. Существует очень хорошая статья по решению этого класса проблем (PDF может по-прежнему доступен here):

Быстрый итерационный метод для уравнений Эйконала. Won-Ki Jeong, Ross T. Whitaker. SIAM журнал по научным вычислениям, Том 30, № 5, pp.2512-2534, 2008

Основная идея состоит в том, чтобы разложить расчетную область в плитки, и зачистка характеристика от источника через домен. По мере того как плитки затрагиваются продвигающейся характеристикой, они добавляются в список активных фрагментов и вычисляются. Каждый раз, когда плитка «решается» (сходится к числовому допуску в случае Эйконала, возможно, состояние в вашей проблеме), он удаляется из рабочего набора, а его соседи активируются. Если фрагмент снова тронут, он снова добавляется в активный список. Процесс продолжается до тех пор, пока не будут вычислены все плитки и активный список пуст. Каждая итерация вычислений может быть решена пуском ядра, который явно синхронизирует расчет. Запускайте столько ядер в последовательности, сколько требуется для достижения пустого рабочего списка.

Я не думаю, что стоит попытаться ответить на ваши вопросы, пока у вас не будет более конкретного алгоритмического подхода и вы будете вдаваться в подробности реализации.

+0

+1 за ваш очень хороший ответ. Метод, о котором вы упомянули, также известен как «быстрый марш», и некоторое время назад я прочитал его, он также используется для сегментации и обработки изображений. – JackOLantern

+0

Да, вы правы. «Быстрый итерационный метод» является более параллельным, чем «метод быстрого похода», и они, строго говоря, являются разными алгоритмами. – JackOLantern

Смежные вопросы