Flat-Field Correction (imaWorx CXP-12 Quad)#
由不均勻照明或鏡頭引起的影像不均勻現象之校正方法(例如 Shading Correction 或 Vignetting Correction)可以透過 Flat-Field Correction 進行補償。
感光元件像素不同的光敏感度所引起的影像不均勻現象,是由感光元件的放大器和 ADC 差異所造成的。對於較舊的 CMOS 感光元件,這可以從強烈的行雜訊 (column noise) 中看出。
Flat-Field Correction 主要針對感光元件影像中的三種類型不均勻現象:
- 暗訊號不均勻性 (DSNU) 的發生是因為每個個別像素都可以有其自身的偏移量。此效應與照明無關,取決於感光元件的溫度,並且隨著 Exposure Time 越長而越明顯。
- 光響應不均勻性 (PRNU) 是由個別像素增益的變化所引起的,這會導致它們對光的響應產生差異。
- 感光元件區域的不同響應可能發生在感光元件的某些區域與其他區域反應不同時。這些變化通常是由感光元件的設計或特定區域之間的溫度差異所引起的。在彩色相機中,這可能會導致影像某些部分出現明顯的顏色差異。
所有效應都可以透過 Flat-Field Correction 來修正。Enhanced Applets 會計算區塊式的 Flat-Field Correction。使用 Enhanced Applets 無法進行逐像素或逐行的平場校正。
資訊
部分 Basler 相機也將 Flat-Field Correction 作為相機功能提供。如果您的 Basler 相機支援 Flat-Field Correction,Basler 建議您使用該相機功能。如需詳細資訊,請參閱 Flat-Field Correction camera feature documentation。
校正本身可補償這些不均勻性。這是透過減去偏移值,接著進行增益調整以修正光源響應來完成的。
Enhanced Applets 的區塊式 Flat-Field Correction 使用以下程序:
Basler 建議不要手動計算並將數值輸入 Applet 中。請改為選擇以下三個選項之一:
- 在 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 Website 下載 ZIP 檔案格式的 Flat-Field Correction 外掛程式。
系統需求#
若要使用 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. 中:
- 設定要套用 flat-field correction 的 ROI。若保留預設值,將重新計算整個圖像。
-
按一下 下一頁.
當 計算像素偏移量 (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 下拉式清單方塊中,選取要在預覽中將哪些 FFC 值套用到您的影像:增益值、偏移值、兩者皆有或皆無。
- 按一下 Finish 以離開 FFC 外掛程式。
-
當 Line Profile 現在會顯示均勻的影像,且可以擷取高品質的影像。使用
FFC mode parameter來切換 FFC 的啟用或停用。
在 Framegrabber SDK 中計算 Flat-Field Correction#
Basler 提供 Python 指令碼,可協助您在 Framegrabber SDK 中計算並套用平場校正值。
您可以從 Basler 網站以 ZIP 檔案形式下載這些指令碼。該套件包含:
- 一個用於單色影像的指令碼
- 一個用於彩色 (Bayer) 影像的指令碼
資訊
每次重新啟動電腦或開啟影音擷取卡應用程式時,必須將 FFC 設定重新載入至影音擷取卡。影音擷取卡具備揮發性記憶體,因此無法像相機上的 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 設計中取得這些參數值。若要存取 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 指令碼。
- 該指令碼會建立包含 Flat-Field Correction 所需之增益與偏移值的 *.txt 檔案。這些檔案會儲存在與 Python 指令碼相同的目錄中。
若要套用增益與偏移值:
- 開啟 microDisplay X 並載入 Enhanced Applet。
-
在
FFC參數區塊中,從您產生的檔案載入偏移與增益值:

-
瀏覽至儲存增益與偏移檔案的目錄,然後選取適當的檔案。
- 對增益與偏移檔案以及影像中的每個色彩通道重複此步驟。
- 開始影像擷取。
-
在
FFC Mode參數,選取Offset and Gain以套用這些值:
現在已將 Flat-Field Correction 套用到您擷取的影像。
使用 VisualApplets 自訂 Flat-Field Correction 功能#
VisualApplets 包含用於計算區块式 Flat-Field Correction 的設計範例。如果您需要根據應用程式調整功能,而不是使用 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 Offset and Gain。這可以在影像擷取期間進行。
-
您可以在設計階段於 VisualApplets 中,或在執行階段透過您的 SDK 應用程式(pylon API、GenApi、GenTL consumer 或 Framegrabber SDK)來設定 FFC 階層式方塊的動態參數。
以下螢幕擷取畫面顯示了在 VisualApplets 中使用 FFC 階層式方塊以及相關參數。

背景資訊:計算公式#
下列章節說明用於計算 FFC 值的公式。此資訊僅供參考。
資訊
Basler 強烈建議不要手動計算這些值,或手動將其輸入 pylon 或 microDisplay X 中,因為這可能會導致錯誤。請改用提供的指令碼與外掛程式。
決定偏移量與增益係數#
在計算校正值之前,需要進行一些準備工作。
- 您的照明應盡可能均勻。
- 鏡頭光圈與對焦應正確設定。
- Exposure Time 也需要進行設定。
- 相機中的所有前置處理功能(例如類比增益等)都需要進行設定。
- 相機應在正常操作溫度下運作。
偏移量 (Offset)#
計算校正的偏移係數遵循標準方式,並帶有一些個別差異,本節將對此進行說明。
若要確定用於校正 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) 在兩步驟程序中已經透過偏移量進行了校正,則不得執行此操作。
適用於 Bayer Pixel Format 的 FFC#
對於 Bayer Pixel Format,Flat-Field Correction 會在 RAW Bayer 影像轉換為 RGB 或任何其他色彩空間之前進行處理。這能提供最高的精確度。校正係數的計算是針對每個顏色分量分別進行的。作為附帶效果,由於參考影像被校正為完美的白影像,Flat-Field Correction 也同時執行了色彩校正。
區塊式 Flat-Field Correction 的定義#
當記憶體不足以儲存每個個別像素的校正值時,便會使用區塊式平場校正。在此情況下,影像會被分割成您可自行定義大小的區塊。每個區塊在角落處都有其自己的起始偏移量與增益係數。

對於其間的所有像素,係數是透過擷取卡內部的線性差補來決定的。

這會產生非常精確的校正,但無法校正個別像素,特別是針對由個別像素變異所引起的 DSNU 與 PRNU。

手動計算區塊大小與 Applet 參數值#
若要在 Applet 中使用區塊式 Flat-Field Correction,您必須在計算出校正值後執行兩個步驟:
- 設定區塊大小。
- 將校正係數載入至擷取卡上。
設定區塊大小#
由於您可以將具有不同解析度的任何相機連接到擷取卡,因此 Applet 實作旨在適應不同的解析度。
所有區塊的大小都相同,但它們不一定必須是正方形,也就是說,高度和寬度可能不同。擷取卡總共提供 16384 個用於 Offset 和 Gain 校正值的區塊。因此,您必須調整區塊,以便將區塊分配到影像大小。
範例: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
- 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
- 位於 x = 8, y = 3 的 Q12
- 位於 x = 4, y = 6 的 Q21
- 位於 x = 6, y = 6 的 Q22
偏移 (Offset) 與增益 (Gain) 的值表示為具有特定範圍和解析度的定點數。該 applet 具有一些用於檢查範圍的資訊參數。

對於給定的範例,增益值具有以下範圍:
換句話說,該 applet 允許高達 3.999 的增益校正。例如,像素值 50 最多可以校正為 50 x 3.999 = 199。
要將浮點數轉換為定點數,請將其乘以小數位數並將其限制在範圍 [0,2GainBits - 1] 內,其中 GainBits = GainInteger + GainFractional。
定點數 Q11、Q12、Q21、Q22 會附加到每個區塊的一個大整數值。
或者作為位元位移運算:
例如,浮點數:
使用上述解析度轉換為定點數:
Applet 值變為
因此,applet 參數值變為
以十六進位表示: