我有一个应用程序,应该计算给定照片的照度。
我的问题是:i can't find a way to calculate this illuminance index (in lux)
我可以使用以下代码获取luminosity
:
UIImage* image = [UIImage imageNamed:@"image.png"];
unsigned char* pixels = [image rgbaPixels];
double totalLuminance = 0.0;
for(int p=0;p<image.size.width*image.size.height*4;p+=4) {
totalLuminance += pixels[p]*0.299 + pixels[p+1]*0.587 + pixels[p+2]*0.114;
}
totalLuminance /= (image.size.width*image.size.height);
totalLuminance /= 255.0;
NSLog(@"Image.png = %f",totalLuminance);
但结果介于0 and 1
之间,我认为我无法用illuminance
计算lux
寻找堆栈溢出的答案我发现这个答案https://stackoverflow.com/a/2720635/839049女巫给了我指示,但我不知道如何继续,因为我不知道如何处理曝光。
..您可以忽略像素数据,只需将曝光信息用作测光表。 ...
如何?有谁知道我该怎么做? 还是有更好的方法呢?
答案 0 :(得分:3)
如果您知道Exif数据的曝光值,那么总场景照度可以计算为
pow(2, Exposure)*(0.3 * Calibration);
不幸的是,校准取决于您正在成像的场景的物理特性。如果你有很多黑暗,低反射率的物体,那么常数必须设置得更高。
通常曝光可以使你从公式得到的平均照度,即所有Y值除以像素数的总和大约是0.5(但这取决于相机的“大脑”:一些摄像机将场景划分为“区域”并对每个区域应用不同的权重,例如,即使这意味着边缘变暗,它们也会尝试在中心区域获得0.5;最新的摄像机会集成对比度值,以便从中捕获最多的细节。他们推断出的是“感兴趣的区域”)。
这意味着您的图像将始终“缩放”,除非您以某种方式指示相机以固定速度拍摄并停止设置,而不以任何方式进行补偿。如果这样做,您将能够使用平均像素亮度来确定总视在照度。
但是,您必须使用已知的仪表校准结果。