2015-11-17 2 views
0

Я хочу ускорить обработку изображений, используя обнаружение круга.Параллельный алгоритм hough с использованием omnithread lib

// For all rows in image: 
    for y:=0 to AnalysisBitmap.Height-1 do 
    begin 
    // For all pixel in one row : 
    for x:=0 to AnalysisBitmap.Width-1 do 
    begin 
     // Is there a point ? 
     if IsPixel(x,y, AnalysisBitmap, 128) then 
     begin 
      for theta:=0 to max_theta do 
      begin 
       TestPoint.x := round (x - r * cos(theta*PI/max_theta)); 
       TestPoint.y := round (y - r * sin(theta*PI/max_theta)); 

       if ((testPoint.x < ImageWidth) and (testPoint.x > 0) and 
        (testPoint.y < ImageHeight) and (testPoint.y > 0)) then Inc(aHoughResult[TestPoint.x,TestPoint.y]); 
      end; 
     end; 
    end; 
    end; 

Как VCL Bitmap не поточно я думаю, я могу только сделать параллельную обработку внутренней Theta Loop? Каков наилучший подход для ускорения этого кода.

+1

Вы считаете библиотеку обработки изображений, такую ​​как OpenCV, если ваша проблема практична? – MBo

+0

да, мы также somethime использование matlab для обработки изображений. В этот раз мы хотим использовать собственный алгоритм с DELPHI – user1769184

+0

Согласовано с @MBo - если это не академическое упражнение, зачем изобретать колесо? Если производительность важна, я бы, вероятно, вообще пропустил многопоточность и пошел прямо в OpenCV ['gpu :: HoughCircles'] (http://docs.opencv.org/2.4/modules/gpu/doc/image_processing.html#gpu-houghcircles). –

ответ

0

Да, этого достаточно, чтобы распараллелить только внутренний цикл. Не забудьте организовать правильный обмен aHoughResult, например - с критической секцией.

В новейших версиях Delphi вы можете использовать как OTL, так и встроенные возможности System.Threading.TParallel.

Самое важное ускорение (я думаю) - заполнить таблицу значениями round(r*cos(theta*PI/max_theta)) и использовать их внутри циклов.

+0

Могу ли я получить подсказку о распределении массива aHoughResult – user1769184

+0

Простейший способ - заблокировать его с помощью критического раздела. – MBo

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