Color Plane Separation

머신 비전 분야에서 기본적인 요구 사항 중 하나는 서로 다른 이미지의 색상 성분을 분리하는 것입니다. 예를 들어 RGB를 각 성분으로 분리하는 것뿐만 아니라, HSL이나 XYZ 등의 색상 공간도 분리할 수 있습니다. 다음에서는 색상 분리에 대한 몇 가지 예시를 보여드립니다. 모든 예제에서는 RGB 면 스캔 카메라를 입력으로 사용합니다. 물론, 이 예제들은 라인 스캔 카메라에도 적용할 수 있습니다. 또한, 사전 베이어 디모자이징(Bayer De-Mosaicing)이나 색 공간 변환이 필요할 수 있으며, 이를 예제에 쉽게 추가할 수 있습니다.

이 예시들은 호스트 PC에서의 후처리를 위해 색상 분리가 필요하다고 가정합니다. 따라서 색상별로 분리된 DMA 전송에 초점을 맞춥니다. FPGA에서 색상 분리된 데이터를 처리해야 하는 경우, 요구 사항에 맞춰 이 예시들을 적용할 수도 있습니다.

여러 예시가 제시됩니다. 모든 예시의 결과는 동일합니다. 그러나 구현 방식은 완전히 다르며 각각 장단점이 있습니다. 요구 사항에 가장 잘 맞는 예시를 선택해야 합니다. 다음 표에는 모든 예시와 일부 속성이 나열되어 있습니다.

Example Name Latency DRAM No. of Block RAM DMA Output
Three DMAs 추가 지연 없음 1 DRAM buffer Low 3 DMA. One for each color component.
Sequential with 3 buffers Latency minimized to theoretical minimum. 3 DRAM buffers Low 1 DMA. Sequential color component output.
Sequential with MultiROI Buffer 1 frame latency and bandwidth limitation. 1 DRAM buffer normal 1 DMA. Sequential color component output.
Sequential with pre-sorted MultiROI Buffer 1 frame latency 1 DRAM buffer High 1 DMA. Sequential color component output.
Sequential with advanced buffer usage 1 frame latency 1 DRAM buffer Low 1 DMA. Sequential color component output.

Table 20. Overview of Color Separation Examples


이전 표에 표시된 속성에 대한 전체 설명과 각 방식에 대한 상세한 설명은 다음 섹션에 설명되어 있습니다.

Color Plane Separation Option 1 - Three DMAs

간략한 설명

파일: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option1_ThreeDMA.va

Default Platform: mE5-MA-VCL

요약 설명

RGB color plane separation examples. The components are split into three DMA output channels.

이 예제는 매우 간단합니다. 입력 RGB 이미지가 버퍼링된 후, 색상 평면이 세 개의 출력 링크로 분할됩니다. 이 세 개의 링크는 세 개의 DmaToPC 오퍼레이터를 사용하여 PC로 전송됩니다. 이 솔루션의 장점은 대기 시간이 최소화된다는 것입니다. 이미지가 프레임 그래버에 버퍼링되지 않습니다. 호스트 PC가 충분히 빠른 경우 ImageBuffer 오퍼레이터는 이미지를 단 한 줄만 지연시킵니다. 추가적인 지연이 발생하지 않습니다. 또 다른 장점은 단 하나의 DRAM 오퍼레이터만 필요하다는 것입니다.

이 구현의 단점은 세 개의 DMA 출력 오퍼레이터가 필요하다는 점입니다. 이 오퍼레이터들은 프레임 그래버의 FPGA 로직 리소스를 많이 소모합니다. 이러한 최소화된 대기 시간이 필요하지 않은 경우, 다음 장에 제시된 솔루션 중 하나를 고려해야 합니다.

컬러 평면 분리 옵션 2 - 3개 버퍼, 1개 DMA

간략한 설명

파일: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option2_ThreeBuffersOneDMA.va

Default Platform: mE5-MA-VCL

요약 설명

RGB 색상 평면 분리 예제. 구성 요소가 분리되어 세 개의 프레임 그래버 버퍼에 버퍼링됩니다. 그 후, 하나의 DMA 채널을 사용하여 색상 평면이 순차적으로 출력됩니다.

RGB 색상 평면 분리를 위한 이 솔루션에서는 DMA 채널을 통해 색상 평면이 순서대로 출력됩니다. 이는 RGB 입력을 구성 요소로 분할하고 세 개의 ImageBuffer 모듈에 색상을 각각 버퍼링하여 수행됩니다. InsertImage 오퍼레이터를 사용하여 ImageBuffer에서 색상 평면을 차례대로 읽어옵니다.

이 예제에서는 데이터를 ImageBuffer에 쓰기 전에 Parallelism을 높이는 것이 중요합니다. 그렇지 않으면 InsertImage 모듈 이후에 병목 현상이 발생하게 됩니다.

이 접근 방식의 장점은 필요한 리소스를 줄여주는 단 하나의 DMA 채널만 필요하다는 점입니다. 또한, 대기 시간은 순차 출력을 위한 이론적 최솟값에 도달합니다. 빨간색 채널에 대한 DMA 전송이 지연 없이 즉시 시작됩니다. 이 솔루션의 단점은 세 개의 프레임 그래버 메모리 오퍼레이터가 필요하다는 것입니다. 이들은 제한되어 있으므로, 이 버퍼들이 더 이상 필요하지 않은 경우에만 유용합니다.

Color Plane Separation Option 3 - Sequential with Operator ImageBufferMultiRoI

간략한 설명

파일: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option3_SequentialMultiROI.va

Default Platform: mE5-MA-VCL

요약 설명

RGB 색상 평면 분리 예제. 세 개의 RGB 색상 평면에 대한 순차적 DMA 출력이 수행됩니다. 시퀀스는 ImageBufferMultiRoI에 의해 생성됩니다. 대역폭을 제한하기 때문에 이 솔루션은 좋지 않습니다. 최적화된 솔루션은 다음 예제를 참조하십시오.

이 솔루션은 이전 예제와 다음 예제 사이의 중간 단계입니다. 대역폭 제한으로 인해 이 솔루션을 구현하는 것은 권장되지 않습니다. 그러나 단 하나의 프레임 그래버 RAM만 요구하면서 이전 예제와 동일한 출력을 얻는 방법을 간단한 방식으로 설명합니다. 이미지를 시퀀스화하기 위해 ImageBufferMultiRoI 오퍼레이터를 사용합니다. 이 오퍼레이터에서는 동일한 이미지를 단순히 세 번 읽습니다. 그런 다음 첫 번째 이미지에는 빨간색 구성 요소, 두 번째 이미지에는 초록색, 세 번째 이미지에는 파란색 구성 요소를 선택합니다. 이는 ModuloCount 및 CASE 오퍼레이터를 사용하여 쉽게 수행할 수 있습니다. ModuloCount는 프레임 번호를 모듈로 3, 즉 {0, 1, 2, 0, 1, 2, ...}로 카운트하도록 매개변수화됩니다.

앞서 언급했듯이 이 솔루션은 대역폭을 줄이므로 최적의 상태가 아닙니다. 그 이유는 동일한 입력 이미지를 세 번 읽지만 세 개의 구성 요소 중 하나만 사용하기 때문입니다. 따라서 모든 읽기 주기에서 데이터의 3분의 2를 폐기하게 됩니다. 다음 예제에서는 이 제한을 극복하는 유사한 솔루션을 보여줍니다.

Color Plane Separation Option 4 - Sequential with Operator ImageBufferMultiRoI and a pre-sort of the Color Planes

간략한 설명

파일: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option4_SequentialPreSortMultiROI.va

Default Platform: mE5-MA-VCL

요약 설명

RGB 색상 평면 분리 예제. 세 개의 RGB 색상 평면에 대한 순차적 DMA 출력이 수행됩니다. 시퀀스는 ImageBufferMultiRoI에 의해 생성됩니다. 추가적인 사전 정렬은 대역폭을 최적화하고 이전 예제에서 제시된 문제를 해결합니다.

이 예제는 이전 예제와 유사합니다. 대조적으로 이 경우에는 대역폭 제한이 없습니다. 개념은 동일합니다. ImageBufferMultiRoI 오퍼레이터를 사용하여 세 가지 색상 구성 요소를 순차화합니다. 이전 예제와 달리, 버퍼 이후에 색상을 분리하지 않습니다. 대신 색상을 버퍼에 쓰기 전에 분리합니다. 이는 다음 그림에 내용이 표시된 HierarchicalBox PreSort에서 수행됩니다.

색상 구성 요소의 사전 정렬

그림 265. 색상 구성 요소의 사전 정렬


이 접근 방식의 개념은 버퍼에 쓰기 전에 색상 구성 요소를 분리하는 것입니다. 이는 모든 이미지 라인에 대해 수행됩니다. 따라서 색상 구성 요소를 세 개의 링크로 분할합니다. 결과적으로 생성된 이 그레이스케일 링크에는 이제 입력 이미지의 이미지 라인이 포함됩니다. 다음으로 라인들이 멀티플렉싱되고 추가됩니다. 그 결과 하나의 큰 이미지 안에 세 개의 그레이스케일 이미지가 생깁니다. 빨간색 구성 요소는 왼쪽에, 초록색은 가운데에, 파란색은 오른쪽에 위치합니다. 구현을 이해하려면 다음 그림의 시뮬레이션 결과를 살펴보십시오.

사전 정렬된 색상 구성 요소의 시뮬레이션 결과

그림 266. 사전 정렬된 색상 구성 요소의 시뮬레이션 결과


이제 ImageBufferMultiRoI에서 왼쪽 부분을 먼저 읽어야 합니다. 그 후 가운데 부분을 읽고 마지막으로 오른쪽 부분을 읽습니다. 따라서 다음에서 볼 수 있듯이 각 ROI에 대해 다른 XOffset을 설정해야 합니다.

ImageBufferMultiRoI 오퍼레이터의 XOffset에 대한 매개변수 설정

그림 267. ImageBufferMultiRoI 오퍼레이터의 XOffset에 대한 매개변수 설정


사용할 때 예제와 같이 구성 요소를 분리하기 전에 Parallelism을 높이는 것을 잊지 마십시오. 이는 InsertLine 모듈 이후의 병목 현상을 방지하는 데 필요합니다. 더 이상 24비트 RGB 이미지가 아닌 그레이스케일 8비트 이미지를 전송하므로 입력보다 최소 3배 더 높은 Parallelism이 필요합니다.

이 솔루션은 단 하나의 DRAM 오퍼레이터만 필요로 하며 대역폭을 제한하지 않습니다. 최적화된 솔루션입니다. 그러나 FIFO에서 분리된 구성 요소 라인을 버퍼링하기 위해 약간의 블록 RAM이 필요합니다. 작은 이미지의 경우 이는 문제가 되지 않습니다. 그러나 라인당 16384픽셀과 같이 이미지 너비가 큰 경우 많은 블록 RAM이 필요합니다. 이 마지막 단점은 다음 예제를 통해 해결됩니다.

컬러 평면 분리 옵션 5 - 고급 처리를 지원하는 순차 출력

간략한 설명

파일: \examples\Processing\Color\ColorPlaneSeparation\ColorPlaneSeparation_Option5_SequentialAdvanced.va

Default Platform: mE5-MA-VCL

요약 설명

색 평면 분리에 대한 예시입니다. RGB 입력이 각 성분으로 분리되어 하나의 DMA 채널을 통해 순차적으로 출력됩니다. 분리는 병렬 워드에서 동일한 성분을 수집하고 FrameBufferRandomRead로 읽는 방식으로 수행됩니다.

이는 VisualApplets에서 색 평면 분리를 위한 가장 고급 예시입니다. 최소한의 리소스 사용과 최대 대역폭에 초점을 맞추고 있습니다. 이전 예시에서는 색 성분을 분리하기 위해 사전 정렬(pre-sorting)을 사용하여 버퍼에서 개별적으로 읽을 수 있도록 했습니다. 그러나 사전 정렬의 FIFO에는 일부 블록 RAM이 필요합니다. 이 방식에서도 사전 정렬을 사용합니다. 대신, 다음 성분으로 전환하기 전에 각 색 성분의 연속된 8개 픽셀만 수집합니다. 이전 예시에서는 다음 라인으로 전환하기 전에 한 성분의 전체 라인을 수집했습니다. 이러한 수정으로 인해 더 이상 FIFO가 필요하지 않습니다. 그러나 이 경우 ImageBufferMultiRoI를 사용할 수 없습니다. 대신 FrameBufferRandomRead를 사용해야 합니다.

사전 정렬은 간단합니다. 먼저 병렬성(Parallelism)을 8로 증가시킵니다. 다음으로 성분들이 분리됩니다. 그 결과 각각 병렬성 8인 3개의 링크가 생성됩니다. 이제 MergeParallel이 성분들의 8번째 픽셀을 시퀀스로 배치합니다. 따라서 R0~R7, G0~G7, B0~B7, R8~R15, G8~G15, B8~B15, ...와 같은 시퀀스를 얻게 됩니다.

동일한 성분의 연속된 8개 픽셀을 수집하여 색상을 분리하는 사전 정렬.

그림 268. 동일한 성분의 연속된 8개 픽셀을 수집하여 색상을 분리하는 사전 정렬.


입력단의 FIFO는 16에서 8로의 PARALLELdn 때문에 필요합니다. 이 FIFO는 DRC 레벨 2 오류를 방지하기 위해서만 필요합니다. 실제로 데이터를 버퍼링할 필요가 없으므로 2 픽셀의 매우 작은 크기로 설정합니다.

픽셀을 사전 정렬한 후, FrameBufferRandomRead 오퍼레이터에서 버퍼링됩니다. 이 오퍼레이터에는 행 및 열 주소 입력이 있으며 데이터를 임의로 읽을 수 있습니다.

FrameBufferRandomRead를 사용한 색상 분리

그림 269. FrameBufferRandomRead를 사용한 색상 분리


이 오퍼레이터는 병렬성이 1인 경우에만 사용할 수 있습니다. 따라서 CastParallel을 사용하여 픽셀당 8비트의 병렬성 8을 픽셀당 64비트의 병렬성 1로 캐스팅합니다. 이것이 이전 단계에서 연속된 8개 픽셀을 수집한 이유입니다.

색상 성분을 분리하려면 원치 않는 색상을 건너뛰기 위해 주소를 2씩 증가시켜야 합니다. 따라서 빨간색 성분의 경우 읽기 주소는 RColA(0) = 0, RColA(1) = 2, RColA(2) = 5, ...가 됩니다. 녹색 성분의 경우 읽기 주소는 RColA(0) = 1, RColA(1) = 3, RColA(2) = 6, ...이 됩니다. 계층형 박스 AdressGenerator가 이러한 읽기 주소를 생성합니다. CreateBlankImage 오퍼레이터가필요한 이미지 크기를 정의합니다. 앞서 8에서 1로 CastParallel을 사용했으므로 8로 나눈 이미지 너비를 사용해야 합니다.

FrameBufferRandomRead 입력을 위한 주소 생성기

그림 270. FrameBufferRandomRead 입력을 위한 주소 생성기


열 주소는 Coordinate_X 출력에 3을 곱하여 간단히 생성됩니다. 현재 성분에 따라 값에 오프셋으로 0, 1 또는 2를 더합니다.

AppendImage를 사용하여 세 개의 주소 이미지가 하나의 더 큰 이미지로 병합됩니다. 행 주소는 0과 이미지 높이 사이의 Counter를 사용하여 간단히 생성됩니다. 이 경우 이 작업을 위해 ModuloCount 오퍼레이터를 사용합니다. 이제 주소를 FrameBufferRandomRead 오퍼레이터에 입력할 수 있습니다. FrameBufferRandomRead의 성능을 극대화하려면 CreatBlankImage 출력에서 병렬성 2를 사용하는 것을 잊지 마십시오.

버퍼를 거치면 첫 번째 라인에는 빨간색 이미지, 그 다음에는 녹색 이미지, 마지막으로 파란색 이미지가 포함된 큰 이미지가 생성됩니다. 이 큰 이미지를 세 개의 분리된 DMA 출력으로 나누기 위해 SplitImage를 사용하고 이미지 높이를 설정합니다.

구현을 이해하는 가장 쉬운 방법은 중간 결과를 단계별로 살펴보는 것입니다. 하나의 결과 이미지를 얻으려면 세 단계를 시뮬레이션해야 합니다. 이는 오퍼레이터 CreateBlankImage를 통해 3개의 이미지가 생성되어야 하기 때문입니다.

이 솔루션은 소수의 블록 RAM 리소스만 필요로 하므로 리소스가 최적화되어 있습니다. 또한 FPGA 로직 리소스가 효율적으로 사용됩니다. 주소 생성에는 적은 수의 리소스만 필요합니다.