Flat-Field Correction (imaFlex CXP-12 Quad)#
可以通过平场校正来补偿由照明不均或镜头引起的图像非均匀性纠正方法,例如“Shading Correction”或“Vignetting Correction”。
传感器像素光灵敏度不同所导致的图像非均匀性是由传感器的放大器和 ADC 差异引起的。对于较旧的 CMOS 传感器,这表现为明显的列噪声。
平场校正主要针对传感器图像中的三种非均匀性:
- 暗信号非均匀性 (DSNU) 的出现是因为每个单独的像素都可以有其自己的偏移量。此效应与光照无关,取决于传感器的温度,并且在更长的 Exposure Time 下会更加明显。
- 光响应非均匀性 (PRNU) 是由各个像素增益的变化引起的,从而导致它们对光的响应存在差异。
- 传感器区域的不同响应可能发生在传感器的某些区域反应不同于其他区域时。这些变化通常是由传感器的设计或特定区域的温度差异引起的。在彩色相机中,这可能会导致图像某些部分出现明显的颜色差异。
所有这些影响都可以通过平场校正来纠正。Enhanced Applets 计算基于区块的平场校正。Enhanced Applets 不支持逐像素或逐列的平场校正。
信息
Flat-Field Correction 在某些 Basler 相机上也作为相机功能提供。如果您的 Basler 相机支持 Flat-Field Correction,Basler 建议您使用该相机功能。有关详细信息,请参阅 Flat-Field Correction 相机功能文档。
校正本身可以补偿这些不均匀性。这是通过减去偏移量,然后应用增益来校正光照响应来实现的。
Enhanced Applets 的基于区块的平场校正采用以下处理过程:
Basler 建议不要手动计算并将数值输入 applet。请改用以下三种选项之一:
- 在 pylon Viewer 中使用用于图像采集卡的 Flat-Field Correction 插件
- 在 Framegrabber SDK 中计算 Flat-Field Correction
- 使用 VisualApplets 自定义 Flat-Field Correction 功能
在 pylon Viewer 中使用用于图像采集卡的 Flat-Field Correction 插件#
Basler 在 pylon Viewer 中提供了一个插件,允许您将平场校正(FFC)应用于采集结果。
您可以在 Basler 网站上将 Flat-Field Correction 插件下载为 ZIP 文件。
系统要求#
要使用 Flat-Field Correction 插件,请确保满足以下设置:
- 已安装 Basler 相机。
-
您的计算机上已安装 pylon 25.10。
信息
- Flat-Field Correction 插件仅适用于 pylon 25.10。
- 如果您从 pylon 8 升级到 25.10:
- 卸载旧版本。
- 仅安装新版本 (pylon 25.10)。
-
采集卡或接口卡已连接到您的计算机。
- 增强型 Applet 已加载到您的采集卡或接口卡上。
安装 FFC 插件#
- 解压下载的 ZIP 文件。
- 找到 EnhAppletFFC.dll 文件。这是 FFC 插件。
- 将您在 VisualApplets 中构建的 EnhAppletFFC.dll 文件放入 pylon 安装文件夹 Applications\x64\lib\pylonviewer\plugins.

使用插件前的准备工作#
在使用 FFC 插件之前,您应该查看以下内容:
- 要了解底层理论,请参阅 Background Information: Calculation Formulas 部分。
在计算校正值之前,请确保:
- 您的照明尽可能均匀。
- 镜头光圈和对焦已正确设置。
- 已配置 Exposure Time。
- 已配置所有相机预处理功能,例如模拟增益。
- 已加载正确的 Enhanced Applet。
- 相机和 applet 中均已设置正确的 Pixel Format。
- 相机已达到其正常工作温度。
- applet 中未设置预处理。您的图像使用了完整的 ROI。

该屏幕截图显示了在 pylon Viewer 中采集图像的过程。正如您从 Line Profile 中所看到的,图像四角处有很强的阴影。此外,某些像素处于饱和状态。这是有意为之的,因为物体的较暗部分才是感兴趣的区域。这也是机器视觉应用的一个实际示例。
计算并应用 Flat-Field Correction 值到您的图像#
-
启动 Flat-Field Correction 插件:
- 在 pylon Viewer 中选择一台相机。
- 停止所选相机的图像采集。
- 在 pylon Viewer 中,选择 Tools > Flat-Field Correction (Frame Grabber)。

-
Flat-Field Correction 插件打开:

-
在步骤 3. Configure the camera. 中:
- 配置要应用平场校正的 ROI。如果保留默认值,则将重新计算整个图像。
-
单击 下一步.
即: Calculate Pixel Offset (DSNU) 页面打开:

-
通过采集一系列暗图像来计算偏置校正值。若要采集暗图像:
- 盖住镜头并采集图像。
- 选择 Calculate pixel offset。
- 点击 Calculate Pixel Offset 按钮。
插件将显示缩放图像和像素偏置值。
-
单击 下一步.
即: Calculate Gain (PRNU) 页面打开:

-
计算增益值:
- 采集一系列明亮的参考图像以获取增益校正值:将均匀的明亮物体(例如一张白纸)放置在镜头下方并采集图像。
-
或者,您可以设置参考像素值和 Exposure Time。
信息
为了减少彩色图像的色彩失真,请使用平均增益值作为参考像素值。
-
点击 Calculate Gain Correction 按钮。
随后将显示增益校正值,并且当您在 View Options 下拉列表中选择 Live - Gain Corrected 时,可以看到经过增益校正的图像。 - 单击 下一步.
即: Calculate Block-Based FFC Values 页面打开:

-
计算平场校正值并将其应用到您的图像。
- 或者,您可以设置块大小或执行自动计算。对于给定的示例,使用的图像大小为 5120 x 5120 像素,因此例如 48 x 34 像素的块大小总共会产生 16157 个块,这小于可用的总块数 16384 个。
- 或者,您可以指定 Linear extension 并将 Edge handling 设置为 Pixel、Half Block 或 Block。
- 要启用 Calculate Correction Data - Store And Apply 按钮,请为计算值指定存储位置。
- 点击 Calculate Correction Data - Store And Apply 按钮。
- 系统将处理计算,在指定的文件夹中生成文件,并将计算出的增益和偏置值应用到您的图像中。
- 在图像上方的 View Options 下拉列表中,选择要在预览图像中应用的 Flat-Field Correction 值:增益值、偏置值、两者皆有或皆无。
- 点击 Finish 以退出 Flat-Field Correction 插件。
-
即: Line Profile 现在显示均质图像,并且可以采集高Quality图像。使用
FFC mode parameter可开启或关闭 FFC。
在 Framegrabber SDK 中计算 Flat-Field Correction#
Basler 提供了 Python 脚本,可帮助您在 Framegrabber SDK 中计算和应用 Flat-Field Correction 值。
您可以从 Basler Website 将这些脚本作为 ZIP 文件下载。该软件包包括:
- 用于单色图像的一个脚本
- 用于彩色(Bayer)图像的一个脚本
信息
每次重启计算机或打开图像采集卡应用程序时,必须将 FFC 设置重新加载到图像采集卡。图像采集卡具有易失性 Memory,因此无法像相机上的 User Sets 那样存储数据。
若要计算 Flat-Field Correction 值,请根据您的图像路径和参数调整 Python 脚本:
- 采集暗图像:
- 盖上镜头并采集一张暗图像。
- 将图像保存到计算机中。
- 采集明亮参考图像(用于增益校正):
- 在镜头下方放置一个均匀的明亮物体(例如一张白纸)并采集图像。
- 将图像保存到计算机中。
-
编辑 Python 脚本:
- 在文本编辑器中打开脚本。
-
在指定部分中更新暗图像和明亮图像的路径:
################# Calculation of pixelwise FFC coefficients for offset and gain########################## # Read dark image # Set the image path darkImage = cv2.imread("C:/.../examples/Processing/Shading/Shading2D/ImagesBlockFFC/darkImage_5120x5120_bayerBG8.bmp",-1) # Read bright image # Set the image path brightImage = cv2.imread("C:/.../examples/Processing/Shading/Shading2D/ImagesBlockFFC/brightImage_5120x5120_bayerBG8.bmp",-1) -
对于彩色图像,还要调整图像路径下方的 Bayer 排列:
# Set bayerpattern bayerpattern = 'BayerBG8' -
调整
# set parameters:部分中的以下参数:您可以从增强型小应用程序(applet)或 VisualApplets 设计中获取这些参数值。若要访问该小应用程序,请在以下工具之一中将其打开:# set parameters: MaxNumberOfBlocksInY = 16384 MaxNumberOfBlocksInX = 3072 blocksize_x = 64 blocksize_y = 64 offsetBits = 8 # "Offset Bits must be more than the fractional bits in it!" offsetFractionalBits = 2 gainBits = 12 #"Gain Bits must be more than the fractional bits in it!" gainFractionalBits = 10 parallelism=16 w = 5120- microDisplay X
- pylon Viewer
- VisualApplets
-
保存更改并运行 Python 脚本。
- 该脚本会创建包含 Flat-Field Correction 所需的增益和偏置值的 *.txt 文件。这些文件保存在与 Python 脚本相同的目录中。
若要应用增益和偏移值:
- 打开 microDisplay X 并加载 Enhanced Applets。
-
在
FFC参数块,从您生成的文件中加载偏移量和增益值:

-
导航到存储增益和偏移量文件的目录,并选择相应的文件。
- 对增益文件和偏移量文件以及图像中的每个颜色通道重复此步骤。
- 开始图像采集。
-
在
FFC Mode参数,选择Offset and Gain以应用这些值:
现在已将 Flat-Field Correction 应用于您采集的图像。
使用 VisualApplets 自定义 Flat-Field Correction 功能#
VisualApplets 包含用于计算基于块的平场校正的设计示例。如果您需要调整该功能以适应您的应用,而不是使用 Enhanced Applets 中的标准实现,请使用这些示例。有关详细信息和存储位置,请参阅 VisualApplets Tutorial。
在 VisualApplets 中使用该示例类似于使用 Enhanced Applets。请按照以下步骤操作:
- 使用 Enhanced Applets 和提供的 Python 脚本计算系数,如 Calculating Flat-Field Correction in the Framegrabber SDK 中所述。
- 在 VisualApplets 中打开 Flat-Field Correction 示例设计。
-
在 VisualApplets 中配置 FFC 层次框的静态参数。
层次框会自动适应像素 Bit Width、Parallelism 和图像格式。首先,您必须对输入链路进行参数化。在设置静态参数之前执行此操作非常重要。
允许的格式为:
Bit width:8 到 16Artithmetic:无符号Parallelism:1 到 64Kernel Columns,Kernel Rows: 1Color Format:VAF_GRAYColor Flavor:FL_NONEMax. Image Width:任意Max. Image Height:任意
静态参数定义了基于块的 FFC 的精度和 FPGA 资源使用情况:
OffsetBits:定义用于偏移量校正的位数。这是整数位和小数位的总和。OffsetFractionalBits: 定义小数位数。有关定点 Arithmetic 的解释,请参见小节 加载校正系数偏移量和增益.GainBits:定义用于增益校正的位数。这是整数位和小数位的总和。GainFractionalBits: 定义小数位数。有关定点 Arithmetic 的解释,请参见小节 加载校正系数偏移量和增益.MemoryType: 选择 UltraRAM、Block RAM 或 LUT RAM。推荐使用 UltraRAM。MaxNumbrOfBlocks: 选择用于基于块的 FFC 的最大块数。如果您选择 URAM 作为MemoryType,则只能使用 16384 个块。MaxNumberOfBlocksInX: 定义 X 方向上的最大块数。通常情况下,这应该是Max. Image Width/Parallelism.MaxNumberOfBlocksInY: 定义 Y 方向上的最大块数。MaxBlockSizeInX: 定义 X 方向上的最大块大小。为您的应用选择合适的值。对于通用用途,您可以将其设置为完整图像宽度。MaxBlockSizeInY: 定义 Y 方向上的最大块大小。为您的应用选择合适的值。对于通用用途,您可以将其设置为完整图像高度。
可以在运行时根据应用需求更改动态参数:
CoefficientsXLength: 该值必须与计算并上传的系数文件相匹配,例如您在 pylon Viewer 和 FFC 插件中使用的 Enhanced Applet 的 ROI 大小。CoefficientsYLength: 该值必须与计算并上传的系数文件相匹配,例如您在 pylon Viewer 和 FFC 插件中使用的 Enhanced Applet 的 ROI 大小。BlockSizeMode: 选择Manual或Auto。在自动模式下,可用块将分布在整个图像上。对于手动模式,可以使用以下参数来设置块大小。如果您在 pylon Viewer 中使用了 FFC 插件,请复制对应的值:BlockSizeInX: 如果满足以下条件,则定义块大小BlockSizeMode参数Manual。如果您在 pylon Viewer 中使用了 FFC 插件,请将对应的值复制到此参数。BlockSizeInY: 如果满足以下条件,则定义块大小BlockSizeMode参数Manual。如果您在 pylonViewer 中使用了 FFC 插件,请将对应的值复制到此参数。EnoughBlocksForImageSize: 此只读参数指示所定义的最高块数是否足以应对给定的块大小和 ROI 设置。OffsetCoefficients: 是偏移系数的字段参数。从 FFC pylon 插件上传文本文件。您可以在小节中找到格式说明 加载校正系数偏移量和增益.GainCoefficients: 是偏移系数的字段参数。从 FFC pylon 插件上传文本文件。您可以在小节中找到格式说明 加载校正系数偏移量和增益.FlatFieldCorrectionMode: 选择是开启还是关闭 FFC 偏置和增益。这可以在图像采集过程中进行。
-
既可以在设计时于 VisualApplets 中配置 FFC 层次框的动态参数,也可以在运行时通过 SDK 应用(pylon API、GenApi、GenTL consumer 或 Framegrabber SDK)进行配置。
以下屏幕截图展示了在 VisualApplets 中使用 FFC 层次框及其参数的情况。

背景信息:计算公式#
以下小节解释了用于计算 FFC 值的公式。此信息仅供参考。
信息
Basler 强烈建议不要手动计算这些值或将其手动输入到 pylon 或 microDisplay X 中,因为这可能会导致错误。请改用提供的脚本和插件。
确定偏移量和增益系数#
在计算校正值之前,需要进行一些准备工作。
- 您的照明应尽可能均匀。
- 应正确设置镜头光圈和对焦。
- 还需要配置 Exposure Time。
- 需要配置相机中的所有预处理功能,例如模拟增益等。
- 相机应在正常工作温度下运行。
偏移量#
计算校正的偏移系数遵循标准方法,并结合一些个别差异,本节对此进行了说明。
为了确定用于校正 DSNU 或任何传感器相关偏移的偏移系数,您必须获取一张传感器无法接收到任何光线的相机图像,例如关闭镜头盖。理论上,传感器的输出值应全为零,但由于 DSNU 的存在,像素值可能会产生各自的偏移。因此,所获取的暗场图像代表了偏移场,即偏移系数。
由于 DSNU 会随相机设置和温度而变化,因此您应该在实际条件下获取图像,特别是在曝光和模拟增益设置方面。此外,偏移值应取自多幅图像的平均值,以消除噪声。
D(x, y):位置 x,y 处多幅图像的平均暗像素值Offset(x, y)=D(x, y)
Gain#
您的应用中采集到的物体具有不同的亮度值。您必须识别图像中最亮的部分,例如白色或反光部分。曝光、光圈和照明的设置应使这些部分接近但不饱和。(除非您出于需要,只对暗部感兴趣)。
例如,您想要研究暗背景下的明亮物体。在这种情况下,请在实际展示条件下将物体放在镜头前。所研究物体的最亮点应该接近但不饱和。例如,对于 8 位图像,目标像素值应在 240 左右。接下来,您需要用亮度与该值接近的物体均匀照射传感器。例如,这可以是一张没有任何结构的白纸。同样,任何像素都不应处于饱和状态。记录其中一些参考图像并计算平均图像 P(x,y).
接下来,存在几种方法来推导增益校正的参考像素值。
-
参考图像中的平均值:如果最亮的部分在
P(x,y)与所获取物体的最亮部分相同。因此,您可以使用P(x,y)的平均像素值作为参考。PMean=Mean(P(x,y)).然后,增益系数将为:
$$ Gain(x,y) = \frac{PMean}{(P(x,y)-Offset(x,y))} $$
-
用户定义的参考值或最亮点:如果参考图像中的平均亮度不等于所需的最高像素值,您可以自行定义参考值。这可以是图像中最亮处的值,也可以是参考对象与参考亮图像之间的差值。然后将计算增益值,以便将均匀图像的像素校正到该参考值
PRef.\[ Gain(x,y) = \frac{PRef}{(P(x,y)-Offset(x,y))} \]
在两个公式中,相除之前都会减去先前确定的偏移量。如果 P(x,y) 已经在两步程序中通过偏移量进行了校正,则不得执行此操作。
针对 Pixel Format 为 Bayer 的 FFC#
对于 Bayer Pixel Format,Flat-Field Correction 在将其转换为 RGB 或任何其他色彩空间之前,会在 RAW Bayer 图像上进行处理。这可提供最大的精度。校正系数是针对每个颜色分量单独计算的。作为附带效果,由于参考图像被校正为完美的白平衡图像,Flat-Field Correction 还可实现色彩校正。
基于块的 Flat-Field Correction 定义#
当没有足够的 Memory 来存储每个单个像素的校正值时,将使用基于块的平场校正。在这种情况下,图像被分割成您可以定义大小的块。每个块在角部都有自己的起始偏移量和增益系数。

对于介于两者之间的所有像素,系数是通过采集卡内部的线性插值确定的。

这会产生非常精确的校正,但它无法校正单个像素,尤其是由单个像素变化引起的 DSNU 和 PRNU。

手动计算块大小和小程序参数值#
要在 applet 中使用基于块的 FFC,您必须在计算出校正值后执行两个步骤:
- 配置块大小。
- 将校正系数加载到采集卡上。
配置块大小#
由于您可以将具有不同分辨率的任何相机连接到图像采集卡,因此 applet 的实现旨在适应不同的分辨率。
所有块的大小都相同,但它们不需要是正方形,即高度和宽度可以不同。图像总共为 Offset 和 Gain 矫正值提供了 16384 个块。因此,您必须调整块的大小,以便将块分布到整个图像尺寸。
示例:boost V boA5120-230cm 的分辨率为 5120 x 4096 像素。如果要使用全分辨率,则必须将可用的 16384 个块分配给所有这些块。
这些块不一定非要呈正方形。也许您的阴影在 X 方向上比在 Y 方向上更强,因此您应该在 X 方向上使用较小的块大小,在 Y 方向上使用较大的块大小。
下图显示了非正方形块,其中 X 方向的分辨率高于 Y 方向:

若要将 16384 个块作为正方形块均匀分布在整个图像上,请使用以下公式。
- 图像宽度:
W - 图像高度:
H - 块的总数:
N
图像的总面积为:Image Area = W x H
每个块都是正方形,边长为 s。单个块的面积为:Block Area = s2
块的数量为:
若要求出 s:
对于上面的示例: W = 5120, H = 4096, N = 16384:
并非每个块的边长都可以在 applet 中进行配置。例如,X 方向的块大小必须是 16 的倍数。
对于给定的示例,块大小向下取整为 Bx= 32。
若要计算块高度,您需要考虑非正方形块以充分利用可用块:
s2 = X 中的块大小 x Y 中的块大小 = Bx x By
随后,块高度可确定为:
对于上面的示例,这将是:
实际使用的块数将为:
现在,您可以设置 applet 参数:
FlatFieldCorrectionBlockWidth= 32FlatFieldCorrectionBlockHeight= 40

加载偏移量和增益修正系数#
每个区块都需要一组四个偏移量和增益系数值 Q11、Q12、Q21、Q22。这些值是区块边缘的支持位置。

一个区块的结束位置就是下一个区块的起始位置。因此,当前区块的 Q11、Q12 等于下一个水平区块的 Q21、Q22。
以下示例展示了在 8x6 图像大小下大小为 4x3 的区块。显然,结束位置与下一个区块的起始位置重叠。此外,位于图像边缘的区块结束支持位置超出了图像边界。如果区块大小不是图像大小的整数除数,则图像边缘的区块将超出更远。

- Block 0
- Q11 位于 x = 0, y = 0
- Q12 位于 x = 4, y = 0
- Q21 位于 x = 0, y = 3
- Q22 位于 x = 4, y = 3
- 块 1
- Q11 位于 x = 4, y = 0
- Q12 位于 x = 8, y = 0
- Q21 位于 x = 4, y = 3
- Q22 位于 x = 6, y = 3
- 块 2
- Q11 位于 x = 0, y = 3
- Q12 位于 x = 4, y = 3
- Q21 位于 x = 0, y = 6
- Q22 位于 x = 4, y = 6
- 块 1
- Q11 位于 x = 4, y = 3
- Q12 位于 x = 8, y = 3
- Q21 位于 x = 4, y = 6
- Q22 位于 x = 6, y = 6
Offset 和 Gain 的值表示为具有特定范围和分辨率的定点值。该 applet 包含一些用于检查范围的信息参数。

对于给定的示例,Gain 值的范围如下:
换句话说,该 applet 允许的最大增益校正值为 3.999。例如,像素值 50 最多可以校正为 50 x 3.999 = 199。
要将浮点值转换为定点值,请将其乘以小数位数,并将其限制在范围 [0,2GainBits - 1] 内,其中 GainBits = GainInteger + GainFractional。
定点值 Q11,Q12,Q21,Q22 会附加到每个块的一个大整数值中。
或者作为位移操作:
例如,浮点值:
使用上述分辨率转换为定点格式,结果为
applet 值变为
因此,applet 参数值变为
以十六进制表示: