本文主要是介绍树莓派相机tuning介绍文档机翻,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
相机调整工具(CTT)是一个Python程序,旨在从一组相对较小的校准图像中生成一个完全工作的相机调整JSON文件。一旦工具运行完毕,为了获得所需的图像质量,应该不需要或只需要对JSON文件进行最小的进一步调整。此外,调谐算法被设计为使用最少量的昂贵或专业设备。创建完成的相机调谐所需的过程如下。
1.首先,必须编写一个功能强大的V4L2相机驱动程序(见第3章)。为了编写相机驱动程序,可以复制未校准的tuning文件,该文件应提供可识别的图像。根据您使用的平台,复制vc4/data/uncalibrated.json(Pi 4及更早的设备)或isp/data/uncalibred.json(PI5)中的一个。还应注意tuning文件中列出的黑色级别,以匹配传感器数据表中指定的黑色级别(并放大到16位范围)。
2.必须捕获一组校准图像。同样,这应该使用未校准的调优文件。有两种类型的校准图像,即带有麦克白图表的校准图像和另一组用于测量透镜阴影的完全均匀图像。
3.在Pi 5上,您可以选择捕获一些图像来调整色差校正(CAC)块。这些图像也可以省略。Pi 4或更早版本的设备上不存在此功能。
4.在校准图像全部正确命名并存储在文件夹中的情况下,可以运行CTT。CTT自动在图像中找到麦克白图,并使用它们来测量噪声分布、绿色不平衡、白平衡和颜色矩阵。
5.CTT的输出JSON文件可以直接使用,可能需要进行较小的进一步调整。
- 软件要求
CTT需要安装Python3,并使用以下附加模块
matplotlib
scipy
numpy
cv2
imutils
sklearn
pyexiv2
rawpy
以下命令足以在干净的Ubuntu 18.04.4 LTS安装中安装所有所需的库和模块。这个过程在其他发行版中应该类似。
sudo apt install python3 -pip libexiv2 -dev libboost -python -dev
pip3 install opencv - python imutils matplotlib scikit - learn py3exiv2 rawpy
personal note here:
{
在ubuntu 18.04.6上发现出错,主要还需要安装如下:
sudo apt install libjpeg-dev zlib1g-dev scikit-build
boost1.65.1 from source, wget -O boost_1_55_0.tar.gz http://sourceforge.net/projects/boost/files/boost/1.65.1/boost_1_65_1.tar.gz/download
tar xzvf boost_1_65_1.tar.gz
tar xzvf boost_1_65_1.tar.gz
cd boost_1_65_1/
sh ./bootstrap.sh --with-libraries=python --with-toolset=gcc
sudo find / -name python3.6m
./b2 --with-python include="/usr/include/x86_64-linux-gnu/python3.6m"
sudo b2 install
1522 sudo find / -name libboost_python3*
1526 sudo ln -s /usr/lib/x86_64-linux-gnu/libboost_python3-py36.so.1.65.1 /usr/lib/x86_64-linux-gnu/libboost_python36.so
}
- 设备
摄像机调谐所需的附加设备如下所述。
X-rite(麦克白)颜色检查器
这些图表是众所周知的,如图18所示。它们的价格通常不到100英镑。
色度计需要某种色度计来测量校准图像的色温和光照水平。其中一个如图19所示,通常花费几百英镑。
根据应用的不同,可以使用简单得多的仪器。例如,手机可以很好地报告色温和光照水平,虽然它的读数可能非常接近,但它可能足以满足某些使用情况。
集成球体和平场LED
有一些相对复杂的设备——集成球体和平场LED灯——可以帮助校准透镜遮光,当它们可用时,这些设备可能会被证明是有益的。CTT被设计为对每个色温的多个图像进行平均,因此使用成本低于50英镑的廉价LED视频灯,可能还需要额外的漫射器,可以获得相当合理的结果。如果灯能产生几个色温,接近“室内”和“室外”,那就很方便了。
- 使用libcamera捕获校准图像
调谐过程需要捕获原始图像并将其输入到调谐工具中。如前所述,我们推荐Raspberry Pi的rpicam应用程序用于此目的,但libcamera本身提供的qcam应用程序也很合适。这两个应用程序都将捕获所需的全分辨率原始文件(DNG或Adobe“数字负片”格式)。
捕获原始图像
相机调整文件保存在Raspberry Pi IPA文件夹下的vc4/data(Pi 4或更早的设备)或pisp/data(Pi 5)文件夹中,控制算法希望在那里为每个使用的相机找到一个JSON文件,该文件根据驱动程序中暴露的传感器名称命名。当然,在调整新相机时,我们没有,所以我们为未校准的相机提供了一个可以复制的调整文件。例如,当调整一个名为xyz123的新传感器时,我们只需将unlibrated.json复制到xyz123.json,所有这些都在同一个文件夹中。
新复制的未校准调整将从几乎任何传感器中产生可识别的图像,但只有一个参数必须在使用前进行配置。这是黑电平,必须将其设置为传感器数据表中按比例放大到16位的正确值。因此,如果您的传感器生成10位样本,并且黑色级别为64,那么新的未校准调整文件(xyz123.json)中的正确值将为4096。要使用rpicam静态捕捉DNG,请输入(用您选择的图像名称代替image.jpg)
rpicam - still -r -o image .jpg
它将生成一个名为image.jpg的全分辨率jpeg文件和一个DNG文件image.DNG(名称相同,但扩展名为.DNG)。第二个文件包含生成jpeg的原始数据。
请注意,如果图像过度曝光了而不起作用,CTT有时可能会丢弃图像,并且会在控制台日志中报告这一情况。大多数情况下,产生的调整应该仍然是合理的,但您可能希望以较低的曝光率重新拍摄这些特定的图像,例如:
rpicam - still -r -o image .jpg --ev -1.0
这将一站减少曝光。
图像捕获要求
正如我们已经解释的,有两种(在Pi 5上,可选地有三种)不同类型的校准图像。因为我们最有可能使用未校准的调谐,所以在一些图像中,颜色平衡可能会出现错误。请放心,这没有什么区别——调整工具只使用原始相机数据(不受影响);在拍摄时显示的图像纯粹是为了方便并且有助于对每个镜头进行取景。
麦克白图表图像
这里的目的是捕捉包含麦克白图表的图像。CTT自动定位麦克白图表,因此图表应该
•合理集中,
•不太小,
•相当直,以及
•未被认购,除了边缘的一点点(可能是被持有的地方)。
图像应在不同色温的范围内拍摄,至少涵盖相机预计会遇到的操作条件。对于在广泛的条件下使用的相机系统,这可能包括从大约2500K到大约8000K的灯。在可以产生不同光源的相机实验室和/或在现实世界的操作条件下拍摄图像是可以接受的。通常,校准图片越接近最终操作环境,结果可能越好。以下是几张可接受的校准图片。
左手的照片是在一个专门建造的小型摄影实验室/工作室拍摄的,而第二张照片只是在办公室大厅拍摄的。我们可能不建议比这张左图中的图表小得多。进一步观察,右侧图像显示了一些桶形失真——在显示的水平上,CTT仍然能够处理图像。
拍摄后,应命名图像,以便在文件名中包含色温(后跟“k”或“k”)和照度水平(后跟“l”或“l”)。有效的文件名可能包括
•imx219_2954k_1749l.dng,用于1749勒克斯拍摄的图像,色温为2954k,或
•1749L_2954K.dng,用于同一图像。
LSC图像
与麦克白校准图像一样,图像应根据可用的光源(尽管不一定是相同的光源)以不同的色温拍摄。准确反映和覆盖操作条件范围的图像可能是有益的。然而,在这里,图像必须是完全没有特征的、平坦和均匀的表面,例如LED视频灯。同样,文件名应该包含色温(后面跟着“k”或“k”)。这种情况下不需要记录勒克斯水平,但文件名必须包括alsc,以便在加载这些图像时将其与麦克白图表图像区分开来。
在有专门设备的情况下,每种色温的单镜头阴影图像可能就足够了。否则,应在场景中的亮度变化尽可能低的情况下拍摄图像,并且CTT将为每个色温预期多个校准图像,其中每个图像应在相机旋转或定位不同的情况下进行拍摄。例如,对于每个
我们可能会提交色温
•每张2张图像,一张是相机通常向上的位置,另一张是将相机倒置的位置
向下,或
•每个图像4张,每张图像将相机清晰地放置在LED视频灯上。
CTT对每个色温的图像进行平均,从而减少不均匀照明对场景的影响,并使固有透镜产生的颜色和亮度偏移更容易辨别。
图21:镜头明暗处理图像alsc_3850k_1.dng和alsc_3850k_2.dng。在这种情况下,图像略有不同,因为它们在LED灯上的位置不同。
ALSC算法所需的单个亮度校正表是通过对所有色温的所有LSC图像求平均值来计算的。
色差校正(CAC)图像
此功能仅在Pi 5上可用,在其他平台上可以忽略。即使在Pi 5上,也可以选择提供这些图像。如果没有提供,ISP中的CAC功能将被最终调整文件禁用。可以提供一个或多个CAC图像,并且它们都将通过在文件名中具有字符串CAC来识别。在提供多个图像的情况下,将它们平均在一起以形成最终的CAC调整表。
CAC校正功能仅适用于横向色差。图像应该是cac_chart.pdf文件,应该使用质量合理的打印机打印出来,不会产生任何彩色条纹。通常,通过打印尽可能大的图像以使相机离得更远,优选地至少A3尺寸,将获得最佳结果。我们还建议您注意调整可变焦距的镜头。
图22:此图像cac_chart.pdf应与相机tuning工具一起提供。
- Creating the Tuning
Collecting the Files
一旦捕捉到所有校准图像,就应将它们放在一个文件夹中,不包含其他图像文件。下面的目录列表显示了这样一个校准文件夹可能包含的内容示例。
2498 K_106l .dng
2811 K_403l .dng
2911 K_1208l .dng
2919 K_605l .dng
3627 K_1247l .dng
4600 K_998l .dng
5716 K_1069l .dng
8575 K_170l .dng
alsc_3000K_1 .dng
alsc_3000K_1u .dng
alsc_3850K_1 .dng
alsc_3850K_1u .dng
alsc_6000K_1 .dng
alsc_6000K_1u .dng
在这个例子中,我们有八个麦克白图图像,覆盖八个不同的光源,以及三对仅覆盖三种色温的透镜阴影图像,其中第二对图像与第一对图像相比旋转了180度。请注意,在每个不同的色温下,应该只有一张麦克白图表图像。
Running the Tool
调优工具可以在utils/raspberrrypi/ctt的根libcamera目录下找到,并且可以通过执行那里的ctt.py来运行。它采用以下参数
Table 29: Camera tuning tool command line options.
例如,可以在libcamera文件夹utils/raspberrypi/ctt中输入
./ ctt.py -t vc4 -i ~/ imx219_calibration_folder -o imx219 . json
该工具运行需要几秒钟的时间,报告在此期间的进度。默认配置通常应该是适当的,但为了完整起见,下面包含了一个示例CTT配置文件(同一文件夹中还有CTT_config_example.json)。
{
" disable ": [],
" plot ": [],
" alsc ": {
" do_alsc_colour ": 1,
" luminance_strength ": 0.5
},
"awb": {
" greyworld ": 0
},
" blacklevel ": -1,
" macbeth ": {
" small ": 0,
" show ": 0
}
If necessary the fields here can be modified, as follows.
- tuning结果的微调
Blocks not Tuned
有一些块CTT实际上并没有进行调优,而只是输出默认参数。在这些情况下,默认参数通常应该足够(在某种意义上,它们已经“自适应”于图像),并且除了作为对调整文件的任何更一般的美学更改的一部分之外,没有特别的理由更改它们。这些块是:
1.缺陷像素(rpi.dpc)-这将保持在通常适当的“正常”校正强度。
2.空间去噪(rpi.sdn或rpi.Denoise中的sdn块)-此块没有特定的调整,但是,由于它继承并使用了调整后的图像噪声轮廓,因此不需要特别更改任何内容。
3.Contast(rpi.contrast)-CTT输出伽马曲线,尽管事实上它只是一条固定的“可感测”伽马曲线。没有进行实际测量来推导它,不过,它应该在几乎所有情况下都能很好地工作。
4.锐化(rpi.Sharpening)-默认参数已设置为使用我们现有的传感器提供合理的结果。然而,其他传感器可能需要一些手动调整。例如,对于像素较大的低分辨率传感器,我们可能需要减少锐化量。
5.自动对焦(rpi.af)-默认情况下,此算法未启用。如果手动启用,请注意,默认参数适用于Raspberry Pi v3相机,使用其他相机可能会产生较差的效果。步长和延迟可以安全地保持在默认值,至少对于VCM类型的聚焦机制来说是这样,但在反向距离和镜头设置之间以及在PDAF可用的情况下,调整增益和置信度值之间的映射是至关重要的。
Guidance on how to Tweak the Tuning
CTT尽一切努力生成一个JSON调优文件,该文件可以直接使用,而且只需付出最少的努力。当然,在某些情况下,我们可能会出于纯粹的美学原因(“我想要更少的锐化”或“我想要更明亮的颜色”),或者因为相机的使用情况与调谐的情况略有不同(也许它是在不在校准集中的光源下使用的,这意味着颜色可能会稍微“偏离”)。我们为每个区块提供了一些关于如何调整的一般指导。
黑色等级(rpi.Black_Level)
这里没有什么真正需要调整的,因为黑色级别应该与相机数据表中的级别匹配(放大到16位)。
缺陷像素校正(rpi.dpc)
这里只有一个强度参数,默认为1(“正常”)。如果缺陷像素不明显,那么将其设置为零可能是值得的,因为理论上这将允许恢复稍微更多的细节,尽管效果非常微弱。
如果有缺陷的像素是一个问题,那么该值应该增加到2。请注意,测试应始终包括低光图像,因为当模拟增益高时,“弱”像素往往会从木制品中爬出来。
勒克斯(rpi.Lux)
这里不应该有任何调整。这些值来源于麦克白图的一张校准图像,除非这些图像被分类为不正确的勒克斯读数,否则很难想象可能需要改变什么。
噪声(rpi.Noise)
噪声轮廓本身(由此处的参数定义)通常不应更改。如果需要或多或少的空间去噪,则最好更改空间去噪参数(rpi.sdn或rpi.denoise)。
绿色均衡(rpi.geq)
必须检查测试图像,以确定是否存在绿色不平衡问题,正如前面讨论的“迷宫”伪影所证明的那样。如果校准图像构成的条件比使用相机的条件更广泛,那么这里的数字可能会减少。然而,如果迷宫伪影是可见的,那么它们将需要增加。这里的值(偏移和斜率)定义了一条直线——如果在图像的较暗部分看到迷宫伪影,那么增加偏移可能更有效;如果在图像的明亮部分中看到它们,则可以建议增加斜率。
迷宫伪影可能取决于光源的光照水平和色温,很难准确预测它们何时可能最糟糕。因此,建议使用一个相当广泛的测试集来验证任何变化。
空间去噪(rpi.sdn或rpi.Denoise)
空间去噪控制算法采用之前计算的噪声轮廓,并从中导出ISP参数。它有两个参数-偏差和强度,偏差乘以像素噪声的标准偏差,强度决定了原始(有噪声)像素的混合量。我们可以提供以下经验规则。
1.如果图像显示的是噪声斑点(我们之前看到的“噪声斑点”),则偏差(默认值3.2)应为零。一旦没有噪声斑点,就没有进一步增加噪声斑点的好处(你只会“吃掉”图像细节)。
2.有时可能会减少偏差,尽管需要仔细测试以确定水平是否仍然足够。
3.一旦适当地设置了偏差,就用强度来控制去噪量(其中0有效地完全禁用去噪,1表示最大去噪)。增加这一点将使用更多的去噪像素,尽管可能会出现图像开始看起来有可塑性或“像油画”的情况。在这种情况下,强度应该降低,允许一点原始噪声返回。
Figure 23: Too little denoise (left), and on the right the leaves look even more plasticky than they really are!
AWB(rpi.AWB)
如果不拍摄图像,在有问题的条件下,使用麦克白图表,很难调试与颜色相关的问题,所以这应该是第一步。一旦获得这样的图像,就可能简单地值得用新图像重新运行CTT。
其次,AWB算法具有一些全局“灵敏度”参数。这些主要是为了应对相机之间的模块间变化而设计的,但也可用于将AWB调谐略微向紫色(将感光度_r和感光度_b增加5%或10%)或绿色(将其减少类似比例)移动。这对于那些可能更喜欢略带绿黄色色调的用户和那些不喜欢的用户来说非常方便。
我们可能希望根据个人喜好调整的其他全局参数是whitepoint_r和whitepoint_b。例如,人们通常非常喜欢自己的照片看起来稍微“温暖”一点,所以这有时可能是一个值得在全球范围内做出的改变。这些值可以进行实验,但将whitepoint_-r设置为0.05,whitepoint_b设置为−0.05应该会产生轻微但明显的变暖。
除此之外,我们必须开始深入研究算法的深度。要问的问题有:
•我的问题图片的光源实际上位于CT曲线上吗?如果没有,你可能需要移动至少一部分。
•它是否搜索了足够的CT曲线来找到我的光源?
•是不是我的一些光源在曲线上,但另一些光源太偏了?如果两者都需要工作,您可能需要增加transverse_pos或transverse_neg值,这些值决定了光源可能离曲线有多远。
有时可能只是因为光源在可行集合中,但图像内容误导了算法(它的颜色投射可以被解释为由不同的光源引起)。在某些情况下,可以调整先前的光源分布,以迫使算法找到特定的解决方案——例如,在明亮的条件下,无论图像内容如何,我们都会强烈地将结果偏向阳光。但请记住,AWB从根本上说是一个约束不足的问题——你永远无法完全确定黄色光源下的白墙不是白色光源下的黄墙。
AGC/AEC(rpi.AGC)
CTT只输出一组固定的AGC/AEC参数,尽管在实践中,这组参数与任何相机都能很好地配合使用。
如果发现全局调谐有点太暗或有点太亮,可以使用base_-ev参数轻松调整。将其设置为小于1的值会使所有内容都变暗,而不影响其他内容,而大于1的值则会使所有对象都变亮。
如果需要更具体的更改,如何设置在很大程度上取决于品味:
•AGC区域的权重(在计量模式中);
•在曝光模式下,模拟增益和曝光的划分方式(可能是为了限制相机帧速率);
•各种Y目标功能(允许Y目标随照度水平变化);和
•直方图约束(尽管需要了解AGC算法的章节)。
自动镜头明暗校正(rpi.alsc)
这里有许多由CTT生成的大表,人们不太可能想要手动对这些表进行更改。然而,人们可能会合理地想篡改一些参数。
•omega控制高斯-塞德尔方法中的过度松弛量。默认值为1.3;任何接近1的值都可能正常工作。
•luminance_strength决定亮度校正的量(请记住,着色校正总是完全应用的)。将通过值1.0应用全亮度校正,尽管在实践中0.5到0.8范围内的小值看起来更好。
•n_iter给出高斯-塞德尔迭代次数。一般来说,迭代无论如何都会在这个极限之前停止,所以更改它并没有太大的效果。零值可以作为完全关闭自适应算法的一种方式(仅应用预先测量的校准表)。
•还要注意的是,可以通过从文件中删除预先测量的校准,或者将calibrations_Cr重命名为x.calibrations_Cr,类似地,也可以禁用calibrations-Cb。
•可以增加西格玛值,以迫使自适应算法“清除”更多残留的着色。一旦你的值超过0.01,图像中的一些真实颜色变化就有可能开始轻微模糊;因此不建议使用如此大的值。
Figure 26: sigma has the extreme value 0.03 on the left - spot the purple halo round the green chair.
对比度(rpi.Contrast)
首先,伽马曲线可以很容易地被另一条曲线改变或替换,不受必须有多少点或它们位于什么间隔的限制-任何分段线性函数都可以。当然,这些值必须成对出现(每对数字都是一个(x,y)点),并遵守16位动态范围。
将ce_enable设置为零将完全禁用gamma曲线的任何运行时自适应。当设置为1时,图像的全局对比度可以增加一个或多个:
•为lo_histogram选择更高的分位数(默认值为0.01)。
•在输出范围lo_level(默认值0.015)中选择较低的电平。
•如果所需调整大于此值,则可能需要增加lo_max(默认值500)。
动态范围的高端可以使用这些参数的“hi”(而不是“lo”)版本进行类似的操作,然而,效果通常并不显著。
Figure 27: No contrast enhancement (left) and strong contrast enhancement (right) - note the change to the image histogram.
颜色校正矩阵(rpi.ccm)
矩阵是通过CTT从麦克白图图像中计算出来的。它将它们拟合在RGB空间中,因为这是最简单的,然而,如果希望的话,还有其他可以说更好的方法来实现这一点,例如在Lab*空间中测量拟合误差。
否则,饱和分段线性函数可以实现一些简单的操作。例如,可以全局地降低或增加颜色饱和度。添加以下内容将使全局颜色饱和度增加10%。
" saturation ": [0, 1.1 , 10000 , 1.1]
锐化(rpi.sharp)
所有参数(阈值、强度和极限)都采用默认值1.0。如果很明显需要明显更少(或更多)的锐化,例如,如果传感器表现出与我们习惯的截然不同的行为,那么可能值得应用几轮:
•将所有参数减半(如果锐化过多),或
•将所有参数加倍(当锐化太少时)
直到锐化程度看起来近似于正确的数量级。一旦实现了这一点,就可以对参数进行微调。如果需要更多的锐化:
1.考虑降低阈值,因为这将导致更多的低对比度细节被拾取和锐化。
2.考虑增加极限——这将导致最强、最明显的边缘更加尖锐。
3.考虑增加强度——这将导致所有细节都更加尖锐,达到给定的极限。
为了减少锐化量,应采取相反的步骤。特别是,如果看起来像是无意中拾取并锐化了噪声,则需要提高阈值。
Figure 28: On the left too much residual noise is being sharpened because threshold was lowered.
这篇关于树莓派相机tuning介绍文档机翻的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!