Downsampling Theory
Introduction
This article explains the theory on how to downsample a Zivid point cloud. If you are interested in the SDK implementation, go to Downsample article.
Why Not Keep Every Nth Pixel?
When downsampling an image, the goal is to reduce the size of the image while preserving as much of the quality as possible.
A common approach to downsampling is to keep every second, third, fourth, etc., pixel and discard the rest. However, this is not necessary ideal because of colors filters on the sensor. Take the Bayer filter mosaic as an example. The Bayer filter mosaic grid for a 4x4 image is shown below.
참고
Zivid point clouds coordinate system start with (0,0).
With this filter, each pixel on the camera corresponds to one color filter on the mosaic.
Consider a downsampling algorithm that keeps every other pixel. All kept pixels would correspond to the same color filter:
(1,1) (1,3) (3,1) (3,3) → Blue
(2,1) (2,3) (4,1) (4,3) → Green
(1,2) (1,4) (3,2) (3,4) → Green
(2,2) (2,4) (4,2) (4,4) → Red
Recommended Downsampling Procedure
To preserve data quality, you should consider all pixels and perform downsampling on an even pixel grid (2x2, 4x4, 6x6, etc.). Here is a recommended procedure to reduce the image size by half, e.g., from 4x4 to 2x2.
Downsampling RGB values (color image)
Calculate each pixel value of the new image by averaging every 2x2 pixel grid of the initial image for each channel R, G, and B. For example, to calculate the new R values:
Repeat the same process for G and B values.
Downsampling XYZ values (point cloud)
For point cloud data, we also need to handle NaN values. As with R, G, B color values, X, Y, Z pixel values of the new image should be calculated by taking every 2x2 pixel grid of the initial image. Instead of a normal average, use an SNR-weighted average value for each coordinate. To brush up on how Zivid uses SNR check out our SNR page.
픽셀의 X, Y, Z 좌표는 NaN 값을 가질 수 있지만 해당 픽셀의 SNR 은 NaN이 아닌 경우가 있습니다. 픽셀이 좌표 중 하나에 대해 NaN 값을 갖는지 확인하기 위해 기본 검사를 수행하여 이를 처리할 수 있습니다. X, Y, Z 좌표 중 하나에 대해 NaN 값이 있는 픽셀이 있는지 확인합니다. 그렇다면 해당 픽셀의 SNR 값을 0으로 바꿉니다. 이것은 예를 들어 다음과 같은 픽셀을 선택하여 수행할 수 있습니다. Z 좌표는 NaN이며 SNR 값을 0으로 설정합니다.
여기서 \(isNAN()\) 은 입력 좌표가 NaN인 픽셀만 선택하는 논리 마스킹 함수입니다.
다음 단계는 모든 2x2 픽셀 그리드에 대한 SNR 값의 합계를 계산하는 것입니다.
그런 다음 초기 이미지의 각 픽셀에 대한 가중치를 계산합니다.
\(NaN \cdot 0 = NaN\) 대신에 \(NaN \cdot 0 = 0\) 으로 처리해야 하는 상황을 피하기 위해 다음을 수행하는 것이 좋습니다.
마지막으로 X, Y, Z 좌표 값을 계산할 수 있습니다. 다음은 새로운 X 를 계산하는 예입니다.
Y 및 Z 값에 대해서도 동일한 작업을 수행해야 합니다.