当前位置:网站首页>Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法

Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法

2022-07-06 18:23:00 月照银海似蛟龙

本博客主要内容为

  • 介绍 Blackfly S相机使用的色彩校正矩阵(CCM,color correction matrix)
  • 并展示了如何计算出自定义的CCM。
  • 通过代码进行颜色校正和自定义CCM配置

我们看到的相机拍摄的照片,其实不是相机直接获取的样子,需要经过各种处理,例如白平衡、颜色校正等等,最后才是显示出来被我们眼睛看到,当然各种处理的最终目标就是让我们眼睛看到的照片和我们眼睛直接看到的场景更近似。
照片的处理过程就像下边的流程:
在这里插入图片描述

颜色校正概念

颜色校正是将源图像(捕获的图像)中显示的颜色转换为经过校正的颜色目标图像(最终视图)的过程。

每个传感器对光照都有特定的响应,并且每种照明条件(例如,阳光、荧光灯)都有自己的发射光谱,这会影响光信息捕获时图像的构成方式。
在这里插入图片描述
上图各种光源的发射光谱

传感器将光子转换为电子的效率被称为QE(quantum efficlency),这个值根据光的补偿改变。
在这里插入图片描述
这个是GS3-U3-51S5C(IMX250 sensor)的QE

这里重点解释下什么是QE(quantum efficlency),就是上面的纵轴。
**量子效率(Quantum Efficiency)(光谱特性):**定义为CCD芯片在一定波长入射光的照射下,由光电效应产生的平均光电子数与入射光子数之比,表征了CCD芯片对不同波长入射光的敏感程度。不同波长的光量子效率不同,CCD对某些波长的量子效率可高达98%。

颜色校正考虑了每个颜色通道如何与其他通道相互影响,并独立地缩放每个颜色通道。 CCM 用于测量和补偿这些相互作用。

颜色校正准的重要性

在通过视觉检查或分拣产品等应用中,再现准确的颜色非常重要,因为颜色的微小差异会影响结果的准确性和可靠性。

Blackfly S 使用 CCM 转换将输出图像校正为 sRGB 颜色空间。
sRGB 颜色空间是最常用的色彩空间,因为它为显示器如何再现色彩提供了最佳猜测。

如何进行颜色校正

颜色校正是将源图像(捕获的图像)中显示的颜色转换为经过校正的颜色目标图像(最终视图)的过程。

下面计算公式展示了单个像素的计算:
在这里插入图片描述
展开则是:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对于 n x m 像素的图像大小,这个计算执行 n x m 次。

颜色校正和白平衡的区别

CCM 考虑了颜色通道如何相互影响并相应地缩放单独的通道。 CCM 是非对角线矩阵,并且目标 RGB 值是上述 RGB 值的函数。

白平衡 (WB) 通过独立缩放每个 R、G 或 B 通道来调整发射光谱。 白平衡矩阵是一个对角矩阵,目标 RGB 值根据其源 RGB 值按常数缩放。

两个矩阵如下:
在这里插入图片描述
那么白平衡调整颜色通过下面的计算公式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
以下图像是在暖色的荧光灯条件下拍摄的。
可以比较三种情况的图片效果,分别是:没有颜色校正方法、仅白平衡以及启用白平衡和 CCM 的结果。

在这里插入图片描述
左边的是 WB off,CCM off
中间的是WB on,CCM off
右边的是 WB on,CCM on

Blackfly S如何进行颜色校正

Blackfly S 使用预定义的 CCM 为不同的照明条件创建正确的 sRGB 输出。
预定义的 CCM 被集成到 RGB 变换光源中,因为 CCM 不能独立于白平衡(变换光源)。

CCM可以由Flir上位机 SpinView设置也可以通过API接口进行代码设置

颜色转换选择器显示 RGB 到 RGB 的标准选项。 如果使用不同的像素格式,例如 YUV 或 YCbCr 像素格式,颜色转换选择器会提供 RGB 到 YUV 的选项。 CCM 更改以说明 YUV 如何编码颜色信息。

通过SpinView设置颜色校正

  • 1 连接相机的电脑
  • 2 打开SpinView
  • 3 打开Processing菜单检查 ISP Enable 是否打开
  • 4 检查Color Transformation Enable 是否打开
  • 5 在RGB Transform Light Source 中选择 适当的 RGB 变换光源(暖荧光、冷荧光、晴天、阴天、钨丝灯、阴天、一般)
    在这里插入图片描述
    相关设置在图片上的红框勾出

通过API 代码进行颜色校正设置


//设置 颜色校正

// 开启 ISP
CBooleanPtr ptrIspEnable = nodeMap.GetNode("IspEnable");
ptrIspEnable->SetValue(1);
// 开启 Color Transformation Enable 
CBooleanPtr ptrColorTransformEnable = nodeMap.GetNode("ColorTransformationEnable");
ptrColorTransformEnable->SetValue(1);

// 设置RGB Transform Light Source
CEnumerationPtr ptrRgbTransformLightSource = nodeMap.GetNode
( "RgbTransformLightSource");
CEnumEntryPtr ptrRgbTransformationLightSourceWarm = ptrRgbTransformLightSource->
GetEntryByName("WarmFluorescent3000K");
ptrRgbTransformLightSource->SetIntValue(ptrRgbTransformationLightSourceWarm->GetValue());

如何 自定义 CCM 并设置

有几种类型的标准目标图像颜色。 以下是使用的典型颜色目标:

  • sRGB:标准 RGB 颜色空间。 这是用于显示器、打印机和 Internet 的最常见的色彩空间。
  • Adobe RGB:提供比 sRGB 更大的色彩空间。
  • CIE XYZ:映射人眼如何响应特定波长的光的色彩空间。 sRGB 和 Adobe RGB 是这个空间的子集。

在某些情况下,默认设置可能不足以满足我们的需求。 例如,如果目标颜色不是 sRGB,则需要使用自定义 CCM。因为Blackfly S 是转成 sRGB。

下面用例子的形式,展示了如何将一个(源)的图像颜色转换为相机(目标相机)的图像颜色。

通过上位设置自定义的CCM

要派生自定义 CCM:
1 使用以下目标和源表示法来定义目标和源摄像机。
在这里插入图片描述
2 在标准照明条件下拍摄标准化颜色校准图的图像。 (这个例子显示了一个有 24 个方格的 Macbeth 颜色检查器。)

3 确定每个正方形中的平均像素颜色值,以建立 24 种唯一颜色进行比较。 在这些计算中,k = 24 作为每个正方形中 24 个平均像素颜色:
在这里插入图片描述
4 使用矩阵乘法确定 CCM:
在这里插入图片描述
在这里插入图片描述
5 定义 CCM 后,将 CCM 值映射到 Blackfly S 相机中的相应参数。
在这里插入图片描述
6 使用 SpinView 为自定义 CCM 设置增益值:
RGB Transform Light Source选择Custom
然后选择 Color Transformation Value Selector 选择 Gain00 然后下面设置值的大小
然后把00-22的都设置一遍
在这里插入图片描述

通过API代码设置自定义CCM

设置自定义CCM

//设置自定义CCM

//开启ISP
CBooleanPtr ptrIspEnable = nodeMap.GetNode("IspEnable");
ptrIspEnable->SetValue(1);

//开启ColorTransformationEnable
CBooleanPtr ptrColorTransformationEnable = nodeMap.GetNode("ColorTransformationEnable");
ptrColorTransformationEnable->SetValue(1);

// 将RgbTransformLightSource 设置为 Custom
CEnumerationPtr ptrRgbTransformLightSource = nodeMap.GetNode("RgbTransformLightSource");
CEnumEntryPtr ptrRgbTransformationLightSourceCustom = ptrRgbTransformLightSource
->GetEntryByName("Custom");
ptrRgbTransformLightSource->SetIntValue(ptrRgbTransformationLightSourceCustom
->GetValue());

//设置 Gain00
CEnumerationPtr ptrColorTransformationValueSelector =
nodeMap.GetNode("ColorTransformationValueSelector");
CEnumEntryPtr ptrGain00 = ptrColorTransformationValueSelector->GetEntryByName("Gain00");
ptrColorTransformationValueSelector->SetIntValue(ptrGain00->GetValue());
CFloatPtr Gain00Value = nodeMap.GetNode("ColorTransformationValue");
Gain00Value->SetValue([Enter CCM Value]);
// 同样设置 Gain00-22

原网站

版权声明
本文为[月照银海似蛟龙]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_32761549/article/details/125506550