在阵列上绘制一个圆圈以用于CCD集成目的

时间:2012-01-26 10:45:48

标签: algorithm matlab octave

我正在编写一个函数来在方形数组上绘制一个近似圆(在Matlab中,但问题主要是算法)。
目标是产生一种掩模,用于将落在CCD传感器一部分上的光与衍射限制点光源(其直径对应于CCD阵列上的几个像素)进行积分。总之,CCD传感器看到的是具有旋转对称性的图案,当然没有义务以CCD的一个特定像素为中心(见下面的示例图片)。

以下是我目前用于生成离散圆形蒙版的算法,该算法部分工作(Matlab / Octave代码):

xt = linspace(-xmax, xmax, npixels_cam); % in physical coordinates (meters)
[X Y] = meshgrid(xt-center(1), xt-center(2)); % shifted coordinate matrices
[Theta R] = cart2pol(X,Y);
R = R'; % cart2pol uses a different convention for lines/columns
mask = (R<=radius);

如您所见,我的算法选择(设置为1)物理距离(以米为单位)小于或等于半径的所有像素,不需要是整数。

我觉得我的算法可能不是这个问题的最佳解决方案。特别是,我希望它包括中心所在的像素,即使半径非常小 有什么想法吗?

(有关CCD相机衍射限制点的示例图像,请参阅http://i.stack.imgur.com/3mZ5X.png。)

2 个答案:

答案 0 :(得分:1)

如果您想选择像素,当且仅当它们包含圆圈C的任何部分时

在每个像素中放置一个小圆圈A,其半径= halv大小的像素,另一个围绕它,R = sqrt(2)*圆的一半大小(一个外接圆)

要测试两个圆是否相互接触,您只需计算中心距离并减去两个半径的总和。

如果测试圆C在A范围内,则选择像素。如果它在B而不是C中,则需要测试所有四个像素边的重叠,如Circle line-segment collision detection algorithm?

蛮力近似方法是在每个像素内制作更精细的网格并测试该网格中的每个中心点。

答案 1 :(得分:1)

这是一个经过充分研究的问题。可以进行多种优化:

  • 您可以强制检查每个像素是否在圆圈内。 (r^2 >= (x-x0)^2 + (y-y0)^2

  • 您可以强制检查围绕圆圈的正方形中的每个像素是否在圆圈内。 (r^2 >= (x-x0)^2 + (y-y0)^2其中|x-x0| < r|y-y0| < r

  • 您可以逐行(|y-y0| < r)并计算起始x结尾x并填充其间的所有行。 (虽然平方根并不便宜。)

  • 有更复杂算法的无限可能性。这是一个常见的:http://en.wikipedia.org/wiki/Midpoint_circle_algorithm(填充圆圈留作练习)

这实际上取决于你想要在多么强大的良好表现基础上的复杂程度。