使用全线程库的并行霍夫算法
parallel hough algorithm using 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 位图不是线程安全的,我想我只能对内部 Theta 循环进行并行处理?
加速此代码的最佳方法是什么。
是的,只并行化内循环就足够了。不要忘记组织 aHoughResult
的正确共享,例如 - 使用关键部分。
在最新的 Delphi 版本中,您可以同时使用 OTL 和内置 System.Threading.TParallel
可能性。
最重要的加速(我认为)- 用 round(r*cos(theta*PI/max_theta))
值填充 table 并在循环中使用它。
我想使用霍夫圆检测加速图像处理。
// 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 位图不是线程安全的,我想我只能对内部 Theta 循环进行并行处理? 加速此代码的最佳方法是什么。
是的,只并行化内循环就足够了。不要忘记组织 aHoughResult
的正确共享,例如 - 使用关键部分。
在最新的 Delphi 版本中,您可以同时使用 OTL 和内置 System.Threading.TParallel
可能性。
最重要的加速(我认为)- 用 round(r*cos(theta*PI/max_theta))
值填充 table 并在循环中使用它。