确定图像亮度/亮度值

11

我的iPhone应用程序使用AVFoundation的AVCaptureSession从相机捕获实时数据。我能够在运行时的委托方法中访问该数据并创建图像。它可以是CGImage,UIImage或仅是原始数据(CMSampleBufferRef)。

我想要做的是计算这些数据(图像)的亮度或亮度值,或者可以指示输入光线有多明亮的其他值。

有没有标准的方法来获取这个值?也许使用OpenGL。

提前致谢。

1个回答

16

只需将图像转换为YUV格式,并计算亮度通道的平均值。 颜色转换是一种典型操作,任何体面的图像处理框架都支持它。例如,OpenCV(您说了OpenGL,但那与图像处理没有任何关系,我假设您指的是OpenCV)有CvtColor

如果您没有这样的框架,但可以访问像素强度,则可以使用以下公式:

Y' = 0.299*R + 0.587*G + 0.144*B

获取亮度通道,然后计算平均值。其中R、G和B分别代表红色、绿色和蓝色通道。

编辑

请注意,您的相机可能会通过修改光圈来补偿明亮/黑暗的场景。这取决于相机,但我认为大多数相机都会这样做--否则,您的照片可能会变得过曝(纯白)或纯黑--无论哪种情况都是无用的。人眼实际上也是这样做的do the same thing

缺点是仅仅看图像很难判断您是否处于黑暗或明亮的环境中。在这种情况下,您可能需要超越图像并查询相机。理论上,您可以通过驱动程序直接进行此操作(不太可能),或者通过查看图像元数据(例如,在JPEG中,有EXIF)进行操作。

最后,您没有说明您想了解亮度的确切内容。如果是整个场景,则平均值就足够了。如果是场景的某个部分,则可能需要做一些更聪明的事情。如果是这种情况,请告诉我们。


是的,这确实可行:获取像素信息,将其分割为颜色强度,然后按您在此处展示的方式计算Y。由于我需要相机调整之前小(快速)光脉冲的平均亮度值,因此这种方法效果很好。再次感谢。 - krafter
@misha:你能告诉我计算亮度通道平均值的正确方法吗?我已经卡在这里很长时间了。 - Lakshmi Narayanan
提取亮度通道,对提取的亮度通道中的所有像素求和,将总和除以像素总数。有什么问题吗? - mpenkov
@misha 嗯,问题出在代码上。我有些困惑,如何提取亮度通道?以及如何获取像素值,而不是访问 int、long int、uchar 等类型。我有点糊涂了,请帮帮我。 - Lakshmi Narayanan
@Zypps987 这些是RGB-YUV转换公式中的系数。它们会因具体操作而略有不同。 - mpenkov
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接