Scaling a Line Scan Image

簡短描述

檔案: \examples\Processing\Geometry\ScalingLine\ScalingLineP16.va
\examples\Processing\Geometry\ScalingLine\ScalingLineP8.va

預設平台: mE5-MA-VCL

簡短說明

Scaling 以及線掃描影像的處理與轉換

VisualApplets 設計的「ScalingLineP8.va」與「ScalingLineP16.va」,可將 CameraLink Full 配置下灰階線掃描相機所拍攝的影像, 透過任意倍率進行縮放,以轉換輸入與輸出影像之間的寬度。「ScalingLineP8.va」是針對 8 級並行度所設計,而 「ScalingLineP16.va」則針對 16 級並行度,適用於marathon VCL 平台。 本文檔描述了VisualApplets 中的演算法與實作。若要使用此設計,需計算若干查表 值。 隨附的 C++ 與 Matlab 程式可進行這些計算,以簡化使用流程。

Basic Idea for Scaling/Transformation in a Line

線性影像的縮放/變換/失真校正,是基於來源影像與目標影像的座標進行的。 以下將透過範例座標對,並採用 4 級並行處理,說明該 演算法的基礎原理。

目標座標: 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15
來源座標: 0.3 0.5 1.4 1.5 | 2.2 3.4 3.6 4.2| 5.4 5.5 7.8 8.5 | 9.1 11.4 13.3 14.1

我們採用「目標至來源」的處理程序。對於目標影像(即輸出至電腦的影像)中的每個像素,我們會選取對應的 (四捨五入後的)整數座標 以及來源影像中對應的像素值。 為了處理像素之間的間距,我們還會選取 來源影像中當前像素 座標的前一個鄰近像素。透過線性插值,即可計算出輸出影像中的正確像素值。 由於並行處理的限制,無法從來源影像中逐個讀取像素。因此必須以合適的順序讀取「字」(即同時讀取的 像素單位)。 可能發生某個「字」需要讀取多次,或根本不需要讀取的情況。在這些從原始 影像讀取的「字」中,必須選取正確的像素位置以 生成輸出「字」。讀取的「字」中不需要的像素將會被刪除。以下範例 說明從原始影像 座標進行讀取存取的過程:

記憶體讀取次數(週期) 要求的目標座標 各來源座標 讀取 Word/包含 Pixel 在 Word 中使用 Pixel
1 0, 1 2, 3 0.3, 0.5, 1.4, 1.5 0/ 0、1、2、3 1, 1, 2, 2
2 4 2.2 0/ 0、1、2、3 3、x、x、x
3 5, 6, 7, 8 3.4, 3.6, 4.2, 5.4 1/ 4、5、6、7 4, 4, 5, 6
4 9 5.5 1/ 4、5、6、7 6、x、x、x
5 10, 11, 12 7.8, 8.5, 9.1 2/ 8、9、10、11 9, 8, 10, x
6 13, 14, 15 11.4, 13.3, 14.1 3 / 12、13、14、15 12, 14, 15, x

表 24. 閱讀週期


而「x」則表示該像素已被刪除。

在 VisualApplets 中的實作

該設計的主要組成部分如下(圖335):

1. 與線掃描相機的介面,包含觸發系統與緩衝區;
2. 相機影像的Scaling (單位為 轉換中);
3. 透過 DMA 將資料傳輸至個人電腦;

用於對線性相機影像進行縮放的基本設計架構

圖 335. 線性相機影像縮放的基本設計架構


以下我們將說明主要組件 轉換 進行詳細說明。

Transformation

您可以查看 變換 的組成部分,請參見圖336。

轉型的組成要素

圖 336.轉換的組成部分


相機線掃描影像的縮放是透過「目標至來源」程序進行的。 在 WordToRead 中,我們選定以何種有效 順序從輸入 相機影像中讀取 8 個 (「ScalingLineP8.va」中並行度為 8)或 16 個(「ScalingLineP16.va」中並行度為 16)像素(=「字」)的群組。在 PixelPicker 中,我們決定從讀取的「字」中需要哪些像素。 插值 在計算 輸出影像中的像素值時,會考慮來源影像中像素間的位置關係。

WordToRead

WordToRead 模組的組成部分如圖337 所示。

WordToRead 的組成部分

圖 337.WordToRead的組成部分


從原始影像中讀取單字的順序與頻率,定義於 LUT: WordsToRead中定義。此 表格的內容可透過外部 C++ 程式「ScalingLUTS.cpp」建立,或改用 MATLAB 模組「LUTS_Scaling.m」 及「ScalingTablelLine.m」建立。 相關詳情請參閱本文件中的 節。此查找表的輸入連結由 CreateBlankImage 以及 Coordinate_X。參數 ImageWidth 的 CreateBlankImage 的參數ImageWidth的值,必須與 LUT:WordsToRead中的元素數完全相同。參數 ImageHeight 必須與來源影像在 y 方向上的尺寸相符。來源影像中的文字會從 緩衝區 LineMemoryRandomRd_1 和 LineMemoryRandomRd_2 中讀取,其順序由 LUT:WordsToRead所定義的順序中讀取。來源影像會以線性方式寫入這些緩衝區。由於最大位元 深度為 64 位元且平行度為 1,因此需要兩個緩衝區。對於每個字,系統會選取並讀取前一字的最後一個像素(位於 SYNC)選取並讀取前一字的最後一個像素(位於SYNC 之前的上層運算行)。此值會透過運算子 Merge運算子,將其加到對應的字中。

PixelPicker

在模組中 PixelPicker (參見圖338)中,用於縮放後 輸出字元的像素是透過元件 Pick_0 至 Pick_15 (或至 Pick_7 並行度為 8)從讀取的單詞中選取。若讀取的單詞中的像素無需使用(參見 節) 則查表 RemovePixel 會將其刪除。上述表格(Pick_0 至 Pick_15 及 RemovePixel)的內容,可透過外部 C++ 程式「ScalingLUTS.cpp」建立,或改用 MATLAB 模組 「LUTS_Scaling.m」與「ScalingTablelLine.m」。有關此部分,請參閱本文件中 一節。

PixelPicker 的組成部分

圖 338.PixelPicker的組成元件


在圖339中,HierarchicalBox 的內容 Pick_0 的內容。該 查表 PickComponent0 定義了從(SelectFromParallel: Word 與 Coordinate_X: 數字)中的哪個像素是當前輸出單字的第 0 個組件。透過運算子 CASE 運算子 將選取對應的像素。該像素將與其前一個像素合併後,寫入當前像素(MergePixel)。類似於上述 所述程序,透過 模組 Pick_1 至 Pick_15 (或至 Pick_7)。單一像素 Pick_0 至 Pick_15 (或至 Pick_7) 會以 16 或 8 的並行度與當前經轉換/縮放的單詞進行合併 (MergeParallel ,如圖338 所示)。

Pick_0 的內容

圖 339.Pick_0的內容


Interpolation

為了在傳送至電腦的輸出影像中,獲得像素位置的正確數值,必須考量 原始影像中的像素間位置。 在此模組中 「插值」 模組(圖336)中,會執行線性插值 [Bur06]:

方程式 30。


這裡 是輸出影像中的像素值, 該值對應於 在原始圖像中 位於 x 位置。此外 進行明確的生命週期管理即呼叫 是位於像素座標處的數值 進行明確的生命週期管理即呼叫 在原始圖像中。像素間的位置是 . 有關線性插值的更多資訊, 您可參閱例如 [Bur06]。

本模組的內容 Interpolation 顯示於圖 340. 當前像素的數值 以及他們的 前任者 以運算子分隔 SelectBitField:當前 進行明確的生命週期管理即呼叫 SelectBitField:上一頁. 這些數值的 進行明確的生命週期管理即呼叫 與……相乘 進行明確的生命週期管理即呼叫 根據方程式 30. 關於像素間位置的資訊 包含於四個查表中 Fractional_Part0 設為 分數_第3部分 在設計「ScalingLineP16.va」中。每個 表格都包含 4 個像素的 當前輸出字的像素間位置 . 每個像素間的位置皆具有 6 位元色深。LUT 的內容 Fractional_Part0 設為 分數_第3部分 可透過 外部 C++ 程式「ScalingLUTS.cpp」建立,或改用 MATLAB 模組「LUTS_Scaling.m」及 「ScalingTablelLine.m」建立。關於此點,請參閱 第 在本文件中。 設計「ScalingLineP8.va」包含一個名為 Fractional 的表格,其中儲存了像素間的 位置。其內容亦可透過外部的 C++ 及 Matlab 程式模組建立。 最後,經變換/縮放後的線條影像會透過 DMA 傳輸傳送至個人電腦(參見圖 336)。

插值的組成部分

圖 340.插值的組成部分


Lookup Tables for The VisualApplets Design

設計「ScalingLineP16.va」和「ScalingLineP8.va」所需的查表(參見章節 )可透過 C++ 程式 「ScalingLUTs.cpp」(位於「LUTS_Cpp」資料夾中),亦可透過 MATLAB 程式模組「LUTS_Scaling.m」和「ScalingTableLine.m」(位於 「LUTS_MATLAB」資料夾中)來建立。

ScalingLUTs.cpp

1. 請在程式中(或於命令提示字元中)定義以下參數:

//////////////////////Parameter////////////////////

/ 請指定這些參數!//////////

uint64_t parallelism = 8; // 「ScalingLineP8.va」的值為 8,「ScalingLineP16.va」的值為 16

uint64_t fractionalBits = 6; // = 6:在「ScalingLineP8.va」和「ScalingLineP16.va」中的預設值

uint64_t noOfFractionalLUTs = parallelism == 8 ? 1 : 4; // 分數查找表的數量在 "ScalingLineP8.va" 中為 1,而在 "ScalingLineP16.va" 中為 4

int InputWidth; // 輸入影像的寬度

int OutputWidth; // 傳送至電腦的影像寬度

對於VisualApplets 設計中的「ScalingLineP16.va」,請將並行度參數設定為 16;而「ScalingLineP8.va」則設定為 8。 6 的「fractionalBits」數值是 這兩個設計中的預設值。設計「ScalingLineP16.va」包含四個表(const int noOfFractionalLUTs = 4),其中載有 用於 插值的像素間位置(參見圖340)。 設計「ScalingLineP8.va」則僅有一個表格 (const int noOfFractionalLUTs = 1)。 線條影像的縮放比例由 InputWidth 與 OutputWidth 之間的關係所決定。

2. Run the program!

3. 系統會建立以下檔案,這些檔案可載入至VisualApplets 設計中的查閱表中:

檔案 VA LUT
FractionalTable_0.txt 至 FractionalTable_3.txt Fractional_Part0 (或「分數」以表示並行度為 8) 至 FractionalPart_3
PickerTable_0.txt 至 PickerTable_15.txt (或改為 PickerTable_7.txt) PickComponent0 至 PickComponent15 (或至 PickComponent7)
TableWordsToRead.txt WordsToRead
RemoveTable.txt RemovePixel

表 25. Visual Applets 中的檔案及其對應的查閱表


此外,文字檔案 ScalingTable.txt 也會被建立。該檔案針對每個輸出影像像素,皆包含其在 原始影像中的對應座標(另請參閱 節)。

ScalingTableLine.m and LUTS_Scaling.m

請開啟模組「ScalingTableLine.m」,並定義相關參數

InputWidth=…;

OutputWidth=…;

1. 執行程式!

2. 建立文字檔 ScalingTableLine.txt。該檔針對每個輸出影像的像素,皆包含其在原始影像中的對應座標 。

3. 請開啟模組「LUTS_Scaling.m」,並定義相關參數

並行性 = ...;

NoOfFractionalBits=...;

NoOfFractionalTables=...;

執行程式!所建立的檔案對應於表25中的檔案,這些檔案可載入至VisualApplets 設計中的查閱表中。