Flat-Field Correction (imaFlex CXP-12 Quad)#
因照明不均匀或镜头导致的图像非均匀性校正方法(如“shading correction”或“vignetting correction”)可以通过 Flat-Field Correction 进行补偿。
由于传感器像素光灵敏度差异而在图像中产生的不均匀性是由传感器放大器和 ADC 的差异引起的。对于较旧的 CMOS 传感器,这表现为明显的列噪声。
Flat-Field Correction 解决了传感器图像中的三种主要非均匀性:
- 暗信号不均匀性 (DSNU) 的产生是因为每个单独的像素都可以有其自身的偏移。此效应与光照无关,取决于传感器的温度,并且在 Exposure Time 较长时会更加明显。
- 光响应不均匀性 (PRNU) 是由各个像素增益的变化引起的,这会导致它们对光的响应产生差异。
- 传感器区域响应不同的情况可能发生在传感器的某些区域反应与其他区域不同时。这些变化通常是由传感器的设计或特定区域之间的温度差异引起的。在彩色相机中,这可能会导致图像某些部分出现明显的颜色差异。
所有这些影响都可以通过 Flat-Field Correction 进行校正。Enhanced Applets 计算基于块的 Flat-Field Correction。Enhanced Applets 无法进行逐像素或逐列的 Flat-Field Correction。
信息
部分 Basler 相机也将 Flat-Field Correction 作为相机功能提供。如果您的 Basler 相机支持 Flat-Field Correction,Basler 建议您使用该相机功能。有关详细信息,请参阅 Flat-Field Correction 相机功能文档。
校正本身可补偿这些不均匀性。这是通过减去偏移量,然后应用增益来校正光照响应来实现的。
Enhanced Applets 的基于块的 flat-field correction 采用以下处理过程:
Basler 建议不要手动计算并将值输入小应用程序中。请改用以下三种选项之一:
- 在 pylon Viewer 中使用用于采集卡的 Flat-Field Correction 插件
- 在 Framegrabber SDK 中计算 Flat-Field Correction
- 使用 VisualApplets 自定义 Flat-Field Correction 功能
在 pylon Viewer 中使用用于采集卡的 Flat-Field Correction 插件#
Basler 在 pylon Viewer 中提供了一个插件,允许您将 Flat-Field Correction (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)。
-
采集卡或接口卡已连接到您的计算机。
- 已将 enhanced 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. 中:
- 配置应应用 flat-field correction 的 ROI。如果保留默认值,则将重新计算整个图像。
-
单击 下一步.
即: 计算像素 Offset (DSNU) 页面打开:

-
通过采集一系列暗图像来计算偏移量校正值。要采集暗图像:
- 盖上镜头并采集图像。
- 选择 Calculate pixel offset。
- 单击 Calculate Pixel Offset 按钮。
插件将显示缩放后的图像以及像素 offset 值。
-
单击 下一步.
即: 计算增益 (PRNU) 页面打开:

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

-
计算 Flat-Field Correction 值并将其应用于您的图像。
- 或者,您可以设置块大小或进行自动计算。对于给定的示例,图像大小为 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 下拉列表中,选择要在预览图像中应用的 FFC 值:增益值、offset 值、两者兼有或均不应用。
- 单击 Finish 退出 FFC 插件。
-
即: Line Profile 现在显示均匀的图像,并且可以采集高质量的图像。使用
FFC mode parameter用于开启或关闭 FFC。
在 Framegrabber SDK 中计算 Flat-Field Correction#
Basler 提供 Python 脚本,可帮助您在 Framegrabber SDK 中计算和应用平场校正值。
你可以从 Basler Website 以 ZIP 文件形式下载这些脚本。该软件包包含:
- 用于单色图像的一个脚本
- 一个用于彩色 (Bayer) 图像的脚本
信息
每次重启计算机或打开图像采集卡应用程序时,必须将 FFC 设置重新加载到图像采集卡中。与相机上的 User Sets 不同,图像采集卡具有易失性 Memory,因此无法存储数据。
若要计算平场校正值,请根据您的图像路径和参数调整 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:节:您可以从您的 Enhanced Applets 或 VisualApplets 设计中获取这些参数值。要访问该 applet,请在以下工具之一中将其打开:# 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 脚本。
- 该脚本会创建包含平场校正所需的增益和 offset 值的 *.txt 文件。这些文件保存在与 Python 脚本相同的目录中。
要应用增益和偏移值:
- 打开 microDisplay X 并加载 Enhanced Applet。
-
在
FFC参数块,从您生成的文件中加载偏移和增益值:

-
导航至存储增益和偏移文件的目录,然后选择相应的文件。
- 对增益和偏移文件以及图像中的每个颜色通道重复此步骤。
- 开始图像采集。
-
在
FFC Mode参数中,选择Offset and Gain以应用这些值:
平场校正现已应用于您采集的图像。
使用 VisualApplets 自定义 Flat-Field Correction 功能#
VisualApplets 包含用于计算基于块的 Flat-Field Correction 的设计示例。如果需要针对您的应用调整此功能,而不是使用 Enhanced Applets 中的标准实现,请使用这些示例。有关详细信息和存储位置,请参阅 VisualApplets 教程。
在 VisualApplets 中使用该示例类似于使用 Enhanced Applets。请按照以下步骤操作:
- 使用 Enhanced Applets 和提供的 Python 脚本计算系数,详见 Calculating Flat-Field Correction in the Framegrabber SDK。
- 在 VisualApplets 中打开平场校正示例设计。
-
在 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 Offset 和 Gain。这可以在图像采集过程中进行。
-
既可以在 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 的 FFC#
对于 Bayer Pixel Format,FFC 会在 RAW Bayer 图像转换为 RGB 或任何其他色彩空间之前对其进行处理。这可提供极高的精度。校正系数是针对每个颜色分量单独计算的。作为副作用,由于参考图像被校正为完美的白平衡图像,FFC 同时也起到了色彩校准的作用。
基于块的 Flat-Field Correction 的定义#
当没有足够的内存来存储每个单独像素的校正值时,将使用基于块的 Flat-Field Correction。在这种情况下,图像被分割成可以定义其大小的块。每个块在角点处都有自己的起始偏移和增益系数。

对于中间的所有像素,其系数通过帧采集卡内部的线性插值确定。

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

手动计算块大小和小程序参数值#
要在 applet 中使用基于块的 FFC,在计算出校正值后,您必须执行两个步骤:
- 配置块大小。
- 将校正系数加载到帧采集卡上。
配置块大小#
由于您可以将具有不同分辨率的任何相机连接到图像采集卡,因此小程序实现旨在适应不同的分辨率。
所有块的大小都相同,但它们不需要是正方形,即高度和宽度可能会不同。图像采集卡为偏移和增益校正值总共提供了 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 块大小。显而易见,结束位置与下一个块的起始位置重叠。此外,图像边缘处的块结束支持位置超出了图像边界。如果块大小不是图像大小的整数除数,则图像边缘处的块将超出图像更远。

- 区块 0
- Q11 位于 x = 0, y = 0
- 在 x = 4, y = 0 时的 Q12
- Q21 位于 x = 0, y = 3
- 在 x = 4, y = 3 时的 Q22
- 块 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 具有一些 info 参数用于检查该范围。

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