Optimizing Color Image

Introduction

이 튜토리얼은 Zivid 카메라에서 캡처한 컬러 이미지 품질을 최적화하는 데 도움이 되는 것을 목표로 합니다. 먼저 좋은 색상 정보를 얻기 위한 필수 도구인 획득(Acquisition) 및 색상 설정 조정에 대해 설명합니다. 그런 다음 가장 일반적인 문제(Blooming/over-saturation 및 HDR의 색상 불일치)를 해결하고 이를 극복하는 방법에 대한 권장 사항을 제공합니다.

Zivid 2+ cameras have higher resolution and utilize a better demosaicing algorithm than Zivid 2 cameras; thus, Zivid 2+ outputs higher quality 2D images.

Adjusting Acquisition Settings

Zivid 카메라에서 얻는 컬러 이미지의 품질은 획득 설정에 따라 다릅니다. 이 튜토리얼에서는 원하는 다이내믹 레인지를 얻기 위해 노출 설정(노출 시간, 조리개, 밝기 및 게인)의 조합을 찾는 방법을 다루지 않습니다. 노출 설정에 대한 내용을 확인하고 싶으시면 Getting the Right Exposure for Good Point Clouds 을 확인해주십시오. 이 튜토리얼은 컬러 이미지 품질에 영향을 미치는 특정 획득 설정을 조정하는 데 중점을 둡니다.

노출 시간과 프로젝터 밝기는 컬러 이미지 품질에 영향을 미치지 않습니다. 반면에 흐릿한 컬러 이미지를 피하려면 조리개 값이 높을수록 좋습니다. 아래 그림을 참조하십시오. 아래의 그림에서 볼 수 있듯 5.66 이상의 f-number(더 작은 조리개)에서 이미지가 선명합니다. 자세한 설명 및 안내는 다음을 참조하십시오. Depth of FocusDepth of Focus Calculator.

조리개 10.37로 단일 획득 캡처

조리개 3.67로 단일 획득 캡처

Single acquisition capture with aperture 10.37

Single acquisition capture with aperture 3.67

참고

위의 이미지는 최적의 이미징 거리 밖에서 캡처되어 큰 조리개 값에 대한 아웃포커스 효과를 강조합니다. 이미지는 최적의 범위에서 캡처될 때 덜 흐릿합니다.

높은 Gain 값은 이미지 노이즈(세분성) 수준을 증가시켜 2D 이미지 품질을 저하시키므로 낮은 Gain 값(예: 1-2)을 사용하는 것이 좋습니다. 아래 그림을 참조하십시오.

Gain 1로 단일 획득 캡처

Gain 16으로 단일 획득 캡처

Single acquisition capture with gain 1

Single acquisition capture with gain 16

우리는 종종 포인트 클라우드 품질에 먼저 초점을 맞춰 필요한 다이나믹 레인지와 캡처 시간에 도달하도록 수집 설정을 조정합니다. 이러한 접근 방식에서 컬러 이미지 품질은 주어진 캡처 시간으로 3D 품질에 최적화된 설정의 함수입니다. 이 접근 방식의 단점은 항상 좋은 색상 이미지 품질을 제공하지 않는다는 것입니다. 그러나 사실은 고품질 컬러 이미지(낮은 블러, 낮은 노이즈 및 균형 잡힌 조명)가 고품질 포인트 클라우드를 생성한다는 것입니다. 이를 염두에 두고 위의 미세 조정 지침을 따라 컬러 이미지 품질을 개선하면 3D 품질도 향상된다는 것이 분명합니다. 이를 달성하기 위한 핵심은 노출 시간과 프로젝터 밝기 값을 증가시켜 낮은 Gain과 조리개(높은 f number)를 보정하는 것입니다.

Adjusting Color Settings

조리개 및 Gain 외에도 색상 이미지 품질은 Gamma, Color Balance 및 Color Mode 설정에 따라 다릅니다. 이 섹션에서는 이러한 설정을 최적화하여 컬러 이미지에서 원하는 색상 품질을 얻는 방법에 대한 통찰력을 제공하는 것을 목표로 합니다. 색상 설정에 대한 자세한 내용은 Filters 에서 확인할 수 있습니다.

Gamma

카메라는 사람의 눈과 다르게 휘도를 인코딩합니다. 인간의 눈은 스펙트럼의 어두운 쪽을 강조하지만 카메라는 선형 스케일로 휘도를 인코딩합니다. 이 효과를 보상하기 위해 감마 보정을 적용하여 이미지를 어둡게 또는 밝게 하여 사람의 인식에 더 가깝게 만듭니다.

참고

Zivid 카메라의 경우 감마 보정 값 범위는 0.25에서 1.5 사이입니다.

감마 값이 낮을수록 장면이 더 밝게 나타납니다. 감마 값을 높이면 장면이 더 어둡게 나타납니다.

감마가 0.6으로 설정된 소비재로 가득 찬 빈 캡처

감마가 1.3으로 설정된 소비재로 가득 찬 빈 캡처

Image captured with Gamma set to 0.6

Image captured with Gamma set to 1.3

머신 비전 알고리즘의 이미지 품질을 최적화하기 위해 감마 보정이 필요한지 여부는 의문입니다. 그럼에도 불구하고 사람이 초점 및 입자/노이즈 수준과 같은 컬러 이미지 품질의 특정 측면을 평가하는 데 도움이 됩니다.

구현 예를 보려면 다음을 확인하십시오. Gamma Correction. 이 튜토리얼은 구성 가능한 감마 보정으로 2D 이미지를 캡처하는 방법을 보여줍니다.

Color Balance

주변광의 color temperature 는 컬러 이미지의 외관에 영향을 미칩니다. 적색, 녹색, 청색 채널에 대한 디지털 게인을 조정하여 컬러 이미지를 자연스럽게 보이게 할 수 있습니다. 아래에서 색상 균형을 맞추기 전과 후의 이미지를 볼 수 있습니다. 설정에 대한 색상 균형을 자동으로 찾으려면 Color Balance tutorial. 을 확인하십시오.

참고

Zivid 카메라의 경우 색상 균형가 1.0에서 8.0 사이입니다.

과자 상자의 두 이미지입니다. 왼쪽 이미지에서 녹색이 아주 강합니다.

색상 균형을 수행하면 강하고 다양한 주변 조명 조건에서 유용할 수 있습니다. 프로젝터 없이 또는 낮은 프로젝터 밝기 값으로 캡처를 사용할 때 색상 균형이 필요합니다. 즉, 주변광이 카메라에 보이는 빛의 상당 부분을 차지하는 경우입니다. 프로젝터가 있거나 없는 두 가지 기본 색상 균형 설정이 있습니다. 프로젝터 밝기를 0 또는 끄기로 설정하면 색상 균형이 산업 환경에서 일반적으로 4500K로 보정됩니다. 프로젝터 밝기 값이 0보다 크면 색상 균형이 프로젝터 조명의 색온도에 맞게 보정됩니다.

구현 예는 다음 튜토리얼을 참조하십시오. Adjusting Color Balance . 이 튜토리얼은 루프에서 흰색 표면(종이, 벽 또는 이와 유사한 것)의 이미지를 촬영하여 2D 이미지의 색상 균형을 맞추는 방법을 보여줍니다.

The Zivid 2+ MR130, M60, and LR110 cameras have built-in color balance, so intense or non-white ambient light has little impact on the RGB values in the color image. This eliminates the need to run additional color balance algorithm on these camera models.

The image below shows details from the 2D color image taken with Zivid 2+ MR130 in different ambient light conditions.

300 LUX

1000 LUX

2000 LUX

3200K

2d_images_mr130_lux_kelvins

5000K

6500K

Color Mode

색상 모드 설정은 색상 이미지가 계산되는 방식을 제어합니다. 색상 모드 설정은 다음과 같습니다.

  • ToneMapping

  • Automatic

ToneMapping uses all the acquisitions to create one merged and normalized color image. For multi-acquisition HDR captures the dynamic range of the captured images is usually higher than the 8-bit color image range. Tone mapping will map the HDR color data to the 8-bit color output range by applying a scaling factor. Tone mapping can also be used for single-acquisition captures to normalize the captured color image to the full 8-bit output. When using ToneMapping the color values can be inconsistent over repeated captures if you move, add or remove objects in the scene.

  • Automatic 이 기본 옵션입니다.

  • Automatic 은 획득 설정이 다른 다중 획득 HDR 캡처에 대한 ToneMapping 과 동일합니다.

단일 획득 캡처의 경우 ToneMapping을 사용하여 어두운 이미지를 밝게 할 수 있습니다.

Single acquisition capture with Color Mode set to ::code:`Automatic` (no tone mapping)

Color Mode가 :code:`ToneMapping` 으로 설정된 단일 획득 캡처

Single acquisition capture with Color Mode set to Automatic (no tone mapping)

Single acquisition capture with Color Mode set to ToneMapping

For multi-acquisition HDR tone mapping can be used to map high-dynamic-range colors to the more limited dynamic output range.

Single acquisition capture of the first of three HDR acquisitions with Color Mode set to :code:`Automatic` (no tone mapping)

Single acquisition capture of the second of three HDR acquisitions with Color Mode set to :code:`Automatic` (no tone mapping)

Single acquisition capture of the third of three HDR acquisitions with Color Mode set to :code:`Automatic` (no tone mapping)

Single acquisition capture of the first of three HDR acquisitions with Color Mode set to Automatic (no tone mapping)

Single acquisition capture of the second of three HDR acquisitions with Color Mode set to Automatic (no tone mapping)

Single acquisition capture of the third of three HDR acquisitions with Color Mode set to Automatic (no tone mapping)

Color Mode가 :code:`ToneMapping` 또는 :code:`Automatic` 으로 설정된 세 가지 획득이 포함된 HDR

HDR with three acquisitions with Color Mode set to ToneMapping or Automatic

감마, 색상 균형 및 색상 모드를 포함하여 Zivid SDK로 processing settings 을 설정하는 방법을 확인하십시오.

소스로 이동

source

std::cout << "Configuring settings for capture:" << std::endl;
Zivid::Settings2D settings2D{
    Zivid::Settings2D::Sampling::Color::rgb,
    Zivid::Settings2D::Sampling::Pixel::all,

    Zivid::Settings2D::Processing::Color::Balance::Blue{ 1.0 },
    Zivid::Settings2D::Processing::Color::Balance::Green{ 1.0 },
    Zivid::Settings2D::Processing::Color::Balance::Red{ 1.0 },
    Zivid::Settings2D::Processing::Color::Gamma{ 1.0 },

    Zivid::Settings2D::Processing::Color::Experimental::Mode::automatic,
};

Zivid::Settings settings{
    Zivid::Settings::Color{ settings2D },

    Zivid::Settings::Engine::phase,

    Zivid::Settings::RegionOfInterest::Box::Enabled::yes,
    Zivid::Settings::RegionOfInterest::Box::PointO{ 1000, 1000, 1000 },
    Zivid::Settings::RegionOfInterest::Box::PointA{ 1000, -1000, 1000 },
    Zivid::Settings::RegionOfInterest::Box::PointB{ -1000, 1000, 1000 },
    Zivid::Settings::RegionOfInterest::Box::Extents{ -1000, 1000 },

    Zivid::Settings::RegionOfInterest::Depth::Enabled::yes,
    Zivid::Settings::RegionOfInterest::Depth::Range{ 200, 2000 },

    Zivid::Settings::Processing::Filters::Cluster::Removal::Enabled::yes,
    Zivid::Settings::Processing::Filters::Cluster::Removal::MaxNeighborDistance{ 10 },
    Zivid::Settings::Processing::Filters::Cluster::Removal::MinArea{ 100 },

    Zivid::Settings::Processing::Filters::Hole::Repair::Enabled::yes,
    Zivid::Settings::Processing::Filters::Hole::Repair::HoleSize{ 0.2 },
    Zivid::Settings::Processing::Filters::Hole::Repair::Strictness{ 1 },

    Zivid::Settings::Processing::Filters::Noise::Removal::Enabled::yes,
    Zivid::Settings::Processing::Filters::Noise::Removal::Threshold{ 7.0 },

    Zivid::Settings::Processing::Filters::Noise::Suppression::Enabled::yes,
    Zivid::Settings::Processing::Filters::Noise::Repair::Enabled::yes,

    Zivid::Settings::Processing::Filters::Outlier::Removal::Enabled::yes,
    Zivid::Settings::Processing::Filters::Outlier::Removal::Threshold{ 5.0 },

    Zivid::Settings::Processing::Filters::Reflection::Removal::Enabled::yes,
    Zivid::Settings::Processing::Filters::Reflection::Removal::Mode::global,

    Zivid::Settings::Processing::Filters::Smoothing::Gaussian::Enabled::yes,
    Zivid::Settings::Processing::Filters::Smoothing::Gaussian::Sigma{ 1.5 },

    Zivid::Settings::Processing::Filters::Experimental::ContrastDistortion::Correction::Enabled::yes,
    Zivid::Settings::Processing::Filters::Experimental::ContrastDistortion::Correction::Strength{ 0.4 },

    Zivid::Settings::Processing::Filters::Experimental::ContrastDistortion::Removal::Enabled::no,
    Zivid::Settings::Processing::Filters::Experimental::ContrastDistortion::Removal::Threshold{ 0.5 },

    Zivid::Settings::Processing::Resampling::Mode::upsample2x2,

    Zivid::Settings::Diagnostics::Enabled::no,
};

setSamplingPixel(settings, camera);
std::cout << settings << std::endl;
소스로 이동

source

Console.WriteLine("Configuring settings for capture:");
var settings2D = new Zivid.NET.Settings2D()
{
    Sampling =
    {
        Color = Zivid.NET.Settings2D.SamplingGroup.ColorOption.Rgb,
        Pixel = Zivid.NET.Settings2D.SamplingGroup.PixelOption.All,
    },
    Processing =
    {
        Color =
        {
            Balance =
            {
                Blue = 1.0,
                Green = 1.0,
                Red = 1.0,
            },
            Gamma = 1.0,
            Experimental = { Mode = Zivid.NET.Settings2D.ProcessingGroup.ColorGroup.ExperimentalGroup.ModeOption.Automatic },
        },
    },
};
var settings = new Zivid.NET.Settings()
{
    Engine = Zivid.NET.Settings.EngineOption.Phase,

    RegionOfInterest =
    {
        Box = {
            Enabled = true,
            PointO = new Zivid.NET.PointXYZ{ x = 1000, y = 1000, z = 1000 },
            PointA = new Zivid.NET.PointXYZ{ x = 1000, y = -1000, z = 1000 },
            PointB = new Zivid.NET.PointXYZ{ x = -1000, y = 1000, z = 1000 },
            Extents = new Zivid.NET.Range<double>(-1000, 1000),
        },
        Depth =
        {
            Enabled = true,
            Range = new Zivid.NET.Range<double>(200, 2000),
        },
    },
    Processing =
    {
        Filters =
        {
            Cluster =
            {
                Removal = { Enabled = true, MaxNeighborDistance = 10, MinArea = 100}
            },
            Hole =
            {
                Repair = { Enabled = true, HoleSize = 0.2, Strictness = 1 },
            },
            Noise =
            {
                Removal = { Enabled = true, Threshold = 7.0 },
                Suppression = { Enabled = true },
                Repair = { Enabled = true },
            },
            Outlier =
            {
                Removal = { Enabled = true, Threshold = 5.0 },
            },
            Reflection =
            {
                Removal = { Enabled = true, Mode = ReflectionFilterModeOption.Global },
            },
            Smoothing =
            {
                Gaussian = { Enabled = true, Sigma = 1.5 },
            },
            Experimental =
            {
                ContrastDistortion =
                {
                    Correction = { Enabled = true, Strength = 0.4 },
                    Removal = { Enabled = true, Threshold = 0.5 },
                },
            },
        },
        Resampling = { Mode = Zivid.NET.Settings.ProcessingGroup.ResamplingGroup.ModeOption.Upsample2x2 },
    },
    Diagnostics = { Enabled = false },
};

settings.Color = settings2D;

SetSamplingPixel(ref settings, camera);
Console.WriteLine(settings);
소스로 이동

source

print("Configuring settings for capture:")
settings_2d = zivid.Settings2D()

settings_2d.sampling.color = zivid.Settings2D.Sampling.Color.rgb
settings_2d.sampling.pixel = zivid.Settings2D.Sampling.Pixel.all

settings_2d.processing.color.balance.red = 1.0
settings_2d.processing.color.balance.blue = 1.0
settings_2d.processing.color.balance.green = 1.0
settings_2d.processing.color.gamma = 1.0

settings_2d.processing.color.experimental.mode = zivid.Settings2D.Processing.Color.Experimental.Mode.automatic

settings = zivid.Settings()
settings.engine = zivid.Settings.Engine.phase

settings.region_of_interest.box.enabled = True
settings.region_of_interest.box.point_o = [1000, 1000, 1000]
settings.region_of_interest.box.point_a = [1000, -1000, 1000]
settings.region_of_interest.box.point_b = [-1000, 1000, 1000]
settings.region_of_interest.box.extents = [-1000, 1000]

settings.region_of_interest.depth.enabled = True
settings.region_of_interest.depth.range = [200, 2000]

settings.processing.filters.cluster.removal.enabled = True
settings.processing.filters.cluster.removal.max_neighbor_distance = 10
settings.processing.filters.cluster.removal.min_area = 100

settings.processing.filters.hole.repair.enabled = True
settings.processing.filters.hole.repair.hole_size = 0.2
settings.processing.filters.hole.repair.strictness = 1

settings.processing.filters.noise.removal.enabled = True
settings.processing.filters.noise.removal.threshold = 7.0

settings.processing.filters.noise.suppression.enabled = True
settings.processing.filters.noise.repair.enabled = True

settings.processing.filters.outlier.removal.enabled = True
settings.processing.filters.outlier.removal.threshold = 5.0

settings.processing.filters.reflection.removal.enabled = True
settings.processing.filters.reflection.removal.mode = (
    zivid.Settings.Processing.Filters.Reflection.Removal.Mode.global_
)

settings.processing.filters.smoothing.gaussian.enabled = True
settings.processing.filters.smoothing.gaussian.sigma = 1.5

settings.processing.filters.experimental.contrast_distortion.correction.enabled = True
settings.processing.filters.experimental.contrast_distortion.correction.strength = 0.4

settings.processing.filters.experimental.contrast_distortion.removal.enabled = False
settings.processing.filters.experimental.contrast_distortion.removal.threshold = 0.5

settings.processing.resampling.mode = zivid.Settings.Processing.Resampling.Mode.upsample2x2

settings.diagnostics.enabled = False

settings.color = settings_2d

_set_sampling_pixel(settings, camera)
print(settings)

Troubleshooting

If you encounter any issues with your color image, check Vision troubleshooting articles.

Further reading

How to Get Good 3D Data on a Pixel of Interest 에 대해서 알아보십시오.