用于集成 CCD 图像的抗锯齿布尔蒙版

信息处理 图像处理 matlab 八度
2022-02-02 09:45:21

(这个问题已经在 Stack Overflow 上的 Matlab/Octave/Signal-processing/Image-processing 标签下被问到,但我根据一位用户的建议将其重新发布在这里,该网站可能是解决此类问题的更合适的论坛。)

为 CCD 图像集成目的生成抗锯齿布尔蒙版是否常见/有用?

假设我想整合照射到 CCD 传感器给定区域的光。该区域的边界对应的物理坐标没有义务与我的 CCD 传感器的像素完全一致。

在 Matlab/Octave/(甚至是 Scientific Python)中,用于整合此类区域的常用算法是使用对数组的逻辑运算来定义布尔掩码,例如:

mask = R < radius;

(其中“R”和“掩码”是二维数组,“半径”是浮点数)。这种掩码的值为 0 或 1。

然后,我可以通过对蒙版图像求和来整合包含在我区域边界内的像素:

integrated_signal = sum(sum(mask.*image));

(其中“图像”是 CCD 传感器的输出,例如具有 U16 值的二维阵列)。

但是,从数学上讲,没有什么能阻止我定义连续值蒙版,即像素可以取 0 到 1 之间的任何值的蒙版。从物理上讲,这意味着我可以整合部分像素。我什至可以使用抗锯齿算法来计算这样的掩码,以便更好地近似非方形友好形状,例如圆形(例如,将信号与旋转对称集成)。

我对数字成像极客的问题如下:为成像传感器的集成目的定义这种抗锯齿掩模是标准做法吗?它有用(我怀疑),还是会产生与物理无关的结果?

1个回答

你是对的:从数学上讲,没有什么能阻止你定义灰度蒙版。实际上,这并不是对正在发生的事情的一个很好的近似。

掩码值为 0.5 意味着您将一半的像素值计入信号。首先,这将要求您准确估计并减去相机偏移量,b/c 加上一半的偏移量会搞砸您的结果。更重要的是,这假设像素上的一半信号值必须来自其他地方。

您的其他 0.5 信号可能来自三个来源:

  1. 如果您要集成其信号的源是孤立的,则该边缘像素上的所有信号都将来自您感兴趣的源。所以乘以 0.5 是错误的。

  2. 如果有第二个源也可能对像素有贡献,则划分信号的适当比率取决于每个信号的相对强度以及中心的相对位置。虽然灰度掩码在这里很有意义,但您必须迭代计算它,因为它取决于信号积分。

  3. 如果传感器上有噪音,您会声称其他 0.5 是噪音。这也很可能是错误的 - 您想将全部噪声添加到您的信号中,以便它正确平均(这可能是#2的一个问题)。

这就是为什么除了案例 #2 之外我从未遇到过灰度蒙版。除了不能很好地接近现实之外,灰度蒙版处理起来也不太方便。例如,使用逻辑掩码,您可以方便地编写

integrated_signal = sum(image(mask));