我将如何使用单反相机来测量照片的“绿色”?


13

背景

我的数码照片可以作为amxnx 3矩阵读入计算机程序(如Matlab或R),其中mxn是三个(红色,绿色和蓝色)传感器分别观察到的像素数,并且矩阵中的每个单元都有一个数字从1-255可以反映传感器观察到的亮度。

我想利用这些信息来客观地衡量照片中的绿色度,因为我想尝试将绿色度与植物生长相关联(想象一下,每天玉米田一张照片)。

先前在此方向上的工作已经取得了一些成功,方法是计算绿色指数,即

  • 绿色%=绿色/(蓝色+红色)或
  • 绿色散度= 2 *绿色-红色-蓝色

来自网络摄像机图像的每个mxn像素,但无法控制光圈或入射辐射(太阳角)。

请注意,我并不是要寻找“绝对”的绿色度量标准,数字的规模和分布并不重要-它只需要提供一致的相对绿色度量标准即可。

我可以使用我的SLR来获得可靠的绿色度量,该度量对于以下任何一个或所有特征都是不变的:

  • 云盖?
  • 一天中的时间?
  • 一年中的一天?(这是唯一的要求)
  • 在背景中天空/地面的比例是多少?

当前状态

我提出了以下想法,但是我不确定哪个是必要的,或者哪个对绿色/(红色+蓝色)的比例没有影响

  1. 拍摄白色塑料片的图片,并使用此图片对其他值进行归一化
  2. 固定光圈
  3. 固定快门速度
  4. 用白纸设置白平衡
  5. 从同一角度拍摄所有照片
  6. 在太阳正午拍所有照片

1
您可能会考虑使用人工照明,这会使过程更简单。闪光灯应能充分发挥作用,只需确保闪光灯位于相同的位置并通电即可。
PearsonArtPhoto 2011年

@Pearsonarphoto-一个有趣的主意,我当时正在考虑在白天拍照,但也许在没有月亮的夜晚拍照会更有意义。
David LeBauer 2011年

1
如果您遵循Pearsonartphoto的建议,则需要手动设置快门,光圈和ISO-将快门设置为闪光灯的同步速度(通常为1/200至1/320),并将光圈和ISO设置为低因为它们可以继续使用而不会耗尽闪光灯电源。这将使您的环境尽可能地黑暗-满月应该没问题(另一方面,正午的太阳...)在这种情况下,最好使用同轴闪光灯,因为它将产生最少的阴影。
埃文·克拉尔

2
@Evan我不同意同轴闪光灯。原因是:photo.stackexchange.com/questions/9531/…—太多的直接思考。除了使用偏光镜时,正如我在上面所描述的那样,但是接下来需要确保齿轮保持不变并且白平衡正确完成。偏光镜改变白平衡。
西蒙·

2
叶绿素在近红外中最亮:yale.edu/ceo/Documentation/rsvegfaq.html 有基于此的植物“绿色”标准度量,例如NDVI。因此,如果可以的话,请购买一台可以记录近红外波段的相机。
2011年

Answers:


12

如果您可以处理RAW文件,则将有一个由RGRGRG和GBGBGB行(或可能是RGBGRGBG行)组成的拜耳像素阵列。您可以忽略所有R和B像素,将G像素相加,取平方根( (因为绿色像素的数量是红色或蓝色像素的两倍),然后除以G像素数量的一半。这应该为您的照片中的“绿色”提供适当的加权平均值。然后,您可以取红色和蓝色的平均值,然后从所有三个平均值中计算出绿色百分比。

为了更准确,您可能需要考虑红色,绿色和蓝色传感器像素的适当权重,因为CMOS传感器对每种波长的光都有不同的灵敏度。权重通常取决于传感器。那将是简单的方法。

要考虑到由于一天中的时间,各种类型的人工照明等导致的偏色,则更合适的方法是先使用Lightroom等工具对每张照片进行预处理,以首先校正白平衡,然后对标准RGB像素图像执行计算。与处理RAW传感器数据不同,您希望基于像素“绿色纯度”对计算进行加权,而不是对整个绿色分量进行平均。绿色像素越纯,相对于红色或蓝色像素就越重。在处理之前对白平衡进行归一化应该消除使切线复杂化的复杂度,而这些切线旨在解决诸如云量,一天中的时间,季节等众多因素。

您可能仍要考虑大面积的非入射像素,例如天空。在没有确切了解您要实现的目标方面,我无法真正为您提供帮助。通过计算绿色与红色和蓝色的比率(其中包括“天空”像素),可能最好地满足“照片”整体的绿色要求。

对于您的步骤,不用说,如果您使用相同的相机设置,在相同的光源(相同的强度和色温)下,按照通用基准(例如18%的灰卡)进行测光,则照片显然可以拍摄使您的结果正常化还有很长的路要走。使用数码相机时,可以使用RAW处理软件和基本的白平衡选择器工具纠正任何差异,因此请确保以RAW拍摄。


为了提供更多有关计算照片“绿色”的见解。显然有简单的方法,例如计算绿色拜耳像素与蓝色和红色的权重,或计算与RGB像素的红色/蓝色纯度有关的绿色纯度。如果您转换到更合适的色彩空间(例如HSV色相/饱和度/值,有时称为HSB,用亮度替换值),并使用色相空间中的曲线计算绿色量,则可能会更有运气。(注意:HSL是一种不同类型的色彩空间,因此可能不太适合计算照片中的“绿色”量,因此我将使用HSV。您可以在此处详细了解这些色彩空间。)纯绿色(无论饱和度或值如何)都以120°的色相角落下,并随着您向红色(0°)或向蓝色(240°)的方向从那里掉落。在240°和360°之间,无论饱和度或值如何,像素中的绿色量都为零。

色相图-色相中的绿色纯度
图1.色相图-色相中的绿色纯度

您可以调整实际的权重曲线以满足您的特定需求,但是一条简单的曲线可能类似于以下内容:

range = 240
period = range * 2 = 240 * 2 = 480
scale = 360/period = 0.75
pureGreen = sin(scale * 120)

的值pureGreen应为1.0greenness然后可以按如下方式计算公式:

             sin(scale * hue)   } 0 > hue > 240
greenness = 
             0                  } 240 <= hue <= 360 || hue == 0

hue是HSV颜色值中的颜色度。这radiusperiod其中某种程度上存在绿色的一半。该scale调整罪曲线给我们的期限,这样sin(scale * hue)峰(返回1.0)正是你将有纯绿色(忽略绿色强度)。由于的数量greenness仅在我们周期的前半部分有效,因此绿色计算仅在色度大于0°且小于240°且对于其他任何色度为零时才有效。

您可以通过调整周期来调整权重,定义的范围green可能会存在(即,从0到240,而不是从0到240,您可能会设置类似的约束40 > hue > 200),并定义该范围之外的任何东西以使绿色为0应该注意的是,这在数学上将是准确的,但是可能在感觉上并不是完全准确的。当然,您可以调整公式以将pure green更多点调整为黄色(这可能会产生更直观的准确结果),将曲线的幅度增加到平稳状态,并将纯绿色的范围扩展到某个色调范围,而不是单个范围色调值等。要获得总体人类感知准确度,需要在CIE XYZCIE L a b *中处理更复杂的算法可能需要空间。(注意:在XYZ和实验室空间中工作的复杂性大大超出了我在此描述的范围。)

要计算照片的绿色度,您可以计算每个像素的绿色度,然后得出平均值。然后,您可以从那里获取算法,并针对您的特定需求进行调整。

您可以在EasyRGB上找到用于颜色转换的算法,例如用于RGB到HSV的算法:

var_R = ( R / 255 )                     // Red percentage
var_G = ( G / 255 )                     // Green percentage
var_B = ( B / 255 )                     // Blue percentage

var_Min = min( var_R, var_G, var_B )    //Min. value of RGB
var_Max = max( var_R, var_G, var_B )    //Max. value of RGB
del_Max = var_Max - var_Min             //Delta RGB value 

V = var_Max                             //Value (or Brightness)

if ( del_Max == 0 )                     //This is a gray, no chroma...
{
   H = 0                                //Hue (0 - 1.0 means 0° - 360°)
   S = 0                                //Saturation
}
else                                    //Chromatic data...
{
   S = del_Max / var_Max

   del_R = ( ( ( var_Max - var_R ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_G = ( ( ( var_Max - var_G ) / 6 ) + ( del_Max / 2 ) ) / del_Max
   del_B = ( ( ( var_Max - var_B ) / 6 ) + ( del_Max / 2 ) ) / del_Max

   if      ( var_R == var_Max ) H = del_B - del_G
   else if ( var_G == var_Max ) H = ( 1 / 3 ) + del_R - del_B
   else if ( var_B == var_Max ) H = ( 2 / 3 ) + del_G - del_R

   if ( H < 0 ) H += 1
   if ( H > 1 ) H -= 1
}

1
+1原始处理技术。dcraw来源将是一个很好的起点cybercom.net/~dcoffin/dcraw/dcraw.c
请阅读“我的资料”,

1
原始处理将使绿色水平的计算更加容易,但是使色偏处理更加复杂。
jrista

3

GLOBE项目

请勿使用白纸。它们包含荧光增白剂,该增白剂会将某些紫外线转换为蓝光,从而导致不正确的曝光。这就是为什么存在商业灰卡(由jrista建议)的原因。

从完全相同的地方拍摄所有照片无疑是正确的方法。关于快门速度和光圈,这些无关紧要。快门速度根本不会改变颜色,光圈会使图像模糊,但是我认为当您总结所有像素值时,这种效果还是会消失。我宁愿尝试不断曝光。

关于混浊和不混浊之间的区别,您可能只想运行一些测试。如果真实的绿色量没有快速变化(即从今天到明天),则在检查图片时也不应这样做。也许可以采用经验方法来解决问题(例如,如果发现浑浊时绿色始终高出10%,则可以对此进行补偿)。


它不是GLOBE项目,但可以上交一个项目。感谢您指出该网站。
David LeBauer 2011年

也许您也感兴趣:我目前正在编写一个程序来分析视频,例如来自网络摄像头的视频,以及输出统计信息(绿色份额等)。应该在未来几周内完成。phenocam.granjow.net
Simon A.

听起来很有用。您是否一直在与任何科学家合作?
David LeBauer '02

还不算太多,因为评估方法将是最后一部分(也可以轻松更改/添加)。但这是苏黎世联邦理工学院的一个项目,也将在那里使用。(确切地说,最初它将由高中生用于其Globe项目。)
Simon A. Eugster 2012年

1
  1. 我建议拍摄“ RAW”,并使用相机的自动白平衡但不进行伽玛校正(即色彩平衡但线性输出)转换为16位TIFF。16位将可以更好地计算深阴影和高光中的比率和索引(即无剪切)。DCRAW可以做到这一点,但您的相机将随附其自己的软件,该软件可能更易于使用。

  2. 如果需要索引,则RGB实际上是唯一有用的色彩空间。您已经提到了“绿色差异”指数(也称为“超额绿色指数”)-该指数和与之密切相关的“绿色叶子算法”非常有效。如果要执行基于颜色的像素分类(即蔬菜与非蔬菜),那么我会仔细看为L b *色彩空间,而不是HSV / HSI。实际上,Mathworks网站上有一个很好的演示,说明b *分析。可以将分类与光谱分析相结合,以回答以下问题:a)有多少绿色像素,b)它们有多少绿色?这可能不仅比绿色指数更有用,绿色指数还会受到背景光谱质量(土壤,垃圾等)的影响,背景光谱质量也会随时间变化。您提到了一个玉米作物,所以我认为您是将相机指向下方,而不是指向上方?

  3. 如果您有两个摄像头,则可以将向下看的图像(测量绿色)与测量植被覆盖度的向上看的图像组合在一起。向上的图像将不适用于光谱分析,而像素分类将基于天空/非天空之间的对比度,可能仅使用RGB图像的蓝色通道。

  4. 如果您正在收集(每天?)时间序列,则可以将向下的图像分为“阴天”图像和“晴天”图像,并检查偏差。您可以在原始处理过程中使用色彩平衡来校正偏差(如果存在),或者假设阳光和阴天散布在一个系列中以重新匹配另一个系列(保持简单)。

玩得开心。


如果使用该路径,带有红色,绿色和蓝色图块的彩色图块甚至可能比灰色卡更好。
鱼眼
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.