라인 스캔 이미지 Scaling

간략한 설명

File: \examples\Processing\Geometry\ScalingLine\ScalingLineP16.va
\examples\Processing\Geometry\ScalingLine\ScalingLineP8.va

기본 플랫폼: mE5-MA-VCL

간단한 설명

라인 스캔 이미지의 Scaling 및 변환

VisualApplets 디자인 "ScalingLineP8.va" 및 "ScalingLineP16.va"는 카메라 링크 Full 구성의 그레이스케일 라인 스캔 카메라 이미지를 임의의 팩터로 Scaling하여 입력과 출력 간의 이미지 너비를 변환합니다. "ScalingLineP8.va"는 Parallelism 8용으로, "ScalingLineP16.va"는 marathon VCL 플랫폼의 Parallelism 16용으로 설계되었습니다. 이 문서는 VisualApplets의 알고리즘과 구현을 설명합니다. 이 디자인을 사용하려면 여러 룩업 테이블 값을 계산해야 합니다. 포함된 C++ 및 Matlab 프로그램은 사용을 간소화하기 위해 이러한 계산을 제공합니다.

라인 내 Scaling/변환을 위한 기본 아이디어

라인 이미지의 Scaling/변환/Distortion Correction은 소스 및 타겟 이미지 좌표를 기반으로 수행됩니다. 다음에서는 예시 좌표 쌍과 Parallelism 4를 사용하여 알고리즘의 기본 원리를 설명합니다.

타겟 좌표: 0 1 2 3 | 4 5 6 7 | 8 9 10 11 | 12 13 14 15
s소스 좌표: 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

Target-To-Source 절차를 사용합니다. 타겟 이미지(= PC로 출력되는 이미지)의 모든 픽셀에 대해 소스 이미지의 해당 (반올림된) 정수 좌표와 해당 픽셀 값을 선택합니다. 픽셀 사이의 위치는 소스 이미지에서 현재 픽셀 좌표의 이전 픽셀 이웃도 선택하여 고려됩니다. 선형 보간을 사용하여 출력 이미지의 올바른 픽셀 값이 계산됩니다. Parallelism으로 인해 단일 픽셀을 소스 이미지에서 읽을 수 없습니다. 따라서 "단어(words)"(동시에 읽은 픽셀 단위)를 유용한 순서로 읽어야 합니다. 단어를 두 번 이상 읽거나 전혀 읽지 않아야 할 수도 있습니다. 소스 이미지에서 읽은 이러한 단어 내에서 출력 단어 생성에 필요한 올바른 픽셀 위치를 선택해야 합니다. 읽은 단어에서 필요하지 않은 픽셀은 삭제됩니다. 다음 예는 소스 이미지 좌표에서 읽기 액세스를 보여줍니다:

메모리 읽기 횟수 주기 요청된 타겟 좌표 각각의 소스 좌표 읽기 단어/픽셀 포함 단어 내 픽셀 사용
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(Transformation 내);
3. PC로의 DMA 데이터 전송;

라인 카메라 이미지 Scaling을 위한 기본 디자인 구조

그림 335. 라인 카메라 이미지 Scaling을 위한 기본 디자인 구조


다음에서는 주요 구성 요소인 Transformation에 대해 자세히 설명합니다.

변환

다음의 구성 요소를 확인할 수 있습니다. 변환 의 구성 요소를 확인할 수 있습니다.

변혁의 구성 요소

그림 336. 변환의 구성 요소


카메라 라인 스캔 이미지의 스케일링은 ‘타깃-투-소스(Target-To-Source)’ 방식으로 수행됩니다. 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 바로 앞의 상위 연산 라인). 이 값은 연산자 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의 구성 요소


그림 3 39에서 HierarchicalBox의 내용은 다음과 같습니다. Pick_0 의 내용이 표시되어 있습니다. 조회 테이블 PickComponent0 는 읽은 단어(SelectFromParallel: Word 및 Coordinate_X: Number)의 어느 픽셀이 현재 출력 단어의 0번째 구성 요소인지 정의합니다. 연산자 CASE 를 통해 해당 픽셀이 선택됩니다. 이 픽셀은 바로 앞 픽셀과 합쳐져 현재 픽셀에 기록됩니다 (MergePixel). 앞서 설명한 절차와 유사하게, 현재 출력 워드의 1번부터 15번(또는 병렬도 8일 경우 7번) 픽셀이 모듈 Pick_1 부터 Pick_15 (또는 Pick_7까지). 개별 픽셀 Pick_0 에서 Pick_15 (또는 Pick_7)는 병렬도 16 또는 8로 현재 변환/확대된 단어와 결합됩니다 (MergeParallel (그림 338 참조)로 병합됩니다.)

Pick_0의 내용

그림 339. Pick_0의 내용


보간

PC로 전송되는 출력 이미지의 픽셀 위치에서 올바른 값을 얻기 위해서는 원본 이미지의 픽셀 간 위치 를 고려해야 합니다. 이 모듈에서는 보간 모듈(그림 336)에서는 선형 보간이 수행됩니다 [Bur06]:

식 (30).


여기서 는 출력 이미지의 픽셀 값이며, 이는 값 원본 이미지에서 x 위치에 있습니다. 또한 및 픽셀 좌표에 해당하는 값들은 다음과 같습니다. 및 원본 이미지에서. 픽셀 간 위치는 . 선형 보간에 대한 자세한 내용은 예를 들어 [Bur06].

모듈의 콘텐츠 보간 그림에 나와 있다. 340. 현재 픽셀의 값 및 해당 이전 값 은 다음 연산자로 분리됩니다. SelectBitField: Current 및 SelectBitField: Previous. 다음의 값은 및 와(과) 곱해집니다 및 식에 따라 30. 픽셀 간 위치에 대한 정보는 4개의 룩업 테이블에 포함되어 있습니다 Fractional_Part0 (으)로 Fractional_Part3 (디자인 “ScalingLineP16.va” 내). 각 테이블은 현재 출력 워드의 4개 픽셀에 대한 픽셀 간 위치를 포함합니다 . 모든 픽셀 간 위치는 6비트 깊이를 가집니다. LUT의 콘텐츠는 Fractional_Part0 (으)로 Fractional_Part3 외부 C++ 프로그램 “ScalingLUTS.cpp”를 사용하거나 대안으로 MATLAB 모듈 “LUTS_Scaling.m” 및 “ScalingTablelLine.m”을 사용하여 생성할 수 있습니다. 이와 관련하여 본 문서의 섹션도 참조하십시오. 디자인 “ScalingLineP8.va”에는 픽셀 간 위치를 포함하는 하나의 테이블 Fractional이 있습니다. 이 콘텐츠 역시 외부 C++ 및 MATLAB 프로그램 모듈을 사용하여 생성할 수 있습니다. 마지막으로 변환/스케일링된 라인 이미지가 DMA 전송을 통해 PC로 전송됩니다(그림 336).

보간법 구성 요소

그림 340. 보간법 구성 요소


VisualApplets 설계를 위한 Lookup Tables

디자인 “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; // PC로 전송되는 이미지의 너비

VisualApplets 디자인 "ScalingLineP16.va"의 경우 parallelism 파라미터를 16으로 설정하고, "ScalingLineP8.va"의 경우 8로 설정합니다. 두 디자인 모두 fractionalBits의 수는 기본값인 6입니다. "ScalingLineP16.va" 디자인에는 보간을 위한 픽셀 간 위치를 포함하는 4개의 테이블(const int noOfFractionalLUTs = 4)이 있습니다(그림 340 참조). 반면 "ScalingLineP8.va" 디자인에는 1개의 테이블(const int noOfFractionalLUTs = 1)이 있습니다. 라인 이미지의 Scaling은 InputWidth와 OutputWidth 간의 관계에 의해 정의됩니다.

2. 프로그램을 실행합니다!

3. VisualApplets 디자인의 룩업 테이블에 로드할 수 있는 다음 파일들이 생성됩니다:

파일 VA LUT
FractionalTable_0.txt부터 FractionalTable_3.txt까지 Fractional_Part0(또는 parallelism 8의 경우 Fractional)부터 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 및 LUTS_Scaling.m

“ScalingTableLine.m” 모듈을 열고 다음 파라미터를 정의하십시오.

InputWidth=…;

OutputWidth=…;

1. 프로그램을 실행합니다!

2. 텍스트 파일 ScalingTableLine.txt가 생성됩니다. 이 파일에는 소스 이미지에서 각 출력 이미지 픽셀에 해당하는 좌표가 포함되어 있습니다.

3. “LUTS_Scaling.m” 모듈을 열고 다음 파라미터를 정의하십시오.

parallelism = ...;

NoOfFractionalBits=...;

NoOfFractionalTables=...;

프로그램을 실행합니다! 생성된 파일들은 표 25의 파일들에 해당하며, VisualApplets 디자인의 룩업 테이블에 로드할 수 있습니다.