我正在写一个函数,在方阵上画一个近似圆(在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)物理距离(以米为单位)小于或等于半径(不需要是整数)的所有像素。
我觉得我的算法可能不是解决这个问题的最好方法特别是,我希望它包含中心所在的像素,即使半径很小。
有什么想法吗?
(参见http://i.stack.imgur.com/3mZ5X.png获取CCD相机上衍射限制点的示例图像)。
最佳答案
如果要选择像素,并且仅当它们包含圆C的任何部分时:
在每个像素中放置一个半径为像素大小的一半的小圆a,在其周围放置另一个半径为R=sqrt(2)*圆大小的一半(外接圆)
要测试两个圆是否相互接触,只需计算中心到中心的距离,然后减去两个半径的和。
如果测试圆C在A内,则选择像素如果它在b而不是c内,则需要测试所有四个像素边是否重叠,如Circle line-segment collision detection algorithm?
一种蛮力近似方法是在每个像素内形成一个更精细的网格,并测试该网格中的每个中心点。