如何知道照片是黑色还是太暗?

时间:2014-10-24 21:54:33

标签: ios objective-c iphone image-processing uiimagepickercontroller

我有一个UIImagePickerViewController,用户可以在其中拍照。我的问题是如果用户发送黑暗照片,在将照片上传到服务器之前如何知道。我的意思是完全或接近黑色。

我正在研究,我发现了这个:

const UInt8 *pixels = CFDataGetBytePtr(imageData);
UInt8 blackThreshold = 10; // or some value close to 0
int bytesPerPixel = 4;
for(int x = 0; x < width1; x++) {
  for(int y = 0; y < height1; y++) {
    int pixelStartIndex = (x + (y * width1)) * bytesPerPixel;
    UInt8 alphaVal = pixels[pixelStartIndex]; // can probably ignore this value
    UInt8 redVal = pixels[pixelStartIndex + 1];
    UInt8 greenVal = pixels[pixelStartIndex + 2];
    UInt8 blueVal = pixels[pixelStartIndex + 3];
    if(redVal < blackThreshold && blueVal < blackThreshold && greenVal < blackThreshold) {
      //This pixel is close to black...do something with it
    }
  }
}

但是,我不知道如何应用算法。

1 个答案:

答案 0 :(得分:1)

是的,这是一种相当简单的方法。例如,您可以迭代并查看像素的百分比是纯黑色(即剪切阴影)还是接近黑色。或者,您可以在整个图像中平均像素颜色,看它是否低于某个阈值。有很多方法,这两种方法可能有点简单,但我不确定这是否需要任何特别复杂的东西。您想要使用的阈值取决于您。

此外,虽然它几乎没有实际影响,但如果我对算法很挑剔,我可能只会执行&#34;亮度&#34;如果alphaVal超过某个阈值,则逻辑也是如此,因为颜色信息在图像的透明部分是无意义的。话虽如此,真实照片很少有透明度,所以这可能不是问题。

仅供参考,这里是Apple's code for retrieving the pixel buffer。它是一个老人,但是一个好东西。 (如果我没记错的话,唯一的麻烦就是kCGImageAlphaPremultipliedFirst中的CreateARGBBitmapContext引用必须与(CGBitmapInfo)一起投射。)


顺便说一句,如果您尝试确定特定像素的亮度,一种常见的算法是:

luminance = 0.2126 * red + 0.7152 * green + 0.0722 * blue