当前位置:网站首页>Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法
Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法
2022-07-06 18:23:00 【月照银海似蛟龙】
Flir Blackfly S工业相机:颜色校正讲解及配置与代码设置方法
本博客主要内容为
- 介绍 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
边栏推荐
- NPM install compilation times "cannot read properties of null (reading 'pickalgorithm')“
- json学习初体验–第三者jar包实现bean、List、map创json格式
- ROS learning (26) dynamic parameter configuration
- Image watermarking, scaling and conversion of an input stream
- 永久的摇篮
- AcWing 345. Cattle station solution (nature and multiplication of Floyd)
- AcWing 345. 牛站 题解(floyd的性质、倍增)
- LeetCode. Sword finger offer 62 The last remaining number in the circle
- Hutool post requests to set the body parameter to JSON data
- AcWing 904. Wormhole solution (SPFA for negative rings)
猜你喜欢

C语言关于链表的代码看不懂?一篇文章让你拿捏二级指针并深入理解函数参数列表中传参的多种形式

AcWing 345. 牛站 题解(floyd的性质、倍增)

MySQL execution process and sequence

Recognition of C language array
![Yiwen takes you into [memory leak]](/img/a8/bd1a57ef3bde8910eff2a5f68296df.png)
Yiwen takes you into [memory leak]

蓝桥杯2022年第十三届省赛真题-积木画

Basic introduction and use of dvajs

ROS学习(25)rviz plugin插件

Set WordPress pseudo static connection (no pagoda)

The GPG keys listed for the "MySQL 8.0 community server" repository are already ins
随机推荐
Blue Bridge Cup 2022 13th provincial competition real topic - block painting
AcWing 1140. 最短网络 (最小生成树)
AcWing 1141. LAN problem solving (kruskalkruskal finding the minimum spanning tree)
How did partydao turn a tweet into a $200million product Dao in one year
Input and output of C language pointer to two-dimensional array
The cradle of eternity
ROS学习(21)机器人SLAM功能包——orbslam的安装与测试
POJ 3177 Redundant Paths POJ 3352 Road Construction(双连接)
猫猫回收站
AcWing 346. Solution to the problem of water splashing festival in the corridor (deduction formula, minimum spanning tree)
Shell script quickly counts the number of lines of project code
Hutool post requests to set the body parameter to JSON data
454 Baidu Mianjing 1
设置Wordpress伪静态连接(无宝塔)
The difference between Tansig and logsig. Why does BP like to use Tansig
C语言【23道】经典面试题【下】
JS how to quickly create an array with length n
PartyDAO如何在1年内把一篇推文变成了2亿美金的产品DAO
刨析《C语言》【进阶】付费知识【二】
我如何编码8个小时而不会感到疲倦。