【问题标题】:How to know if a photo is black or too dark?如何知道照片是黑色还是太暗?
【发布时间】:2014-12-20 19:40:14
【问题描述】:

我有一个 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
    }
  }
}

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

【问题讨论】:

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


    【解决方案1】:

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

    另外,虽然它几乎没有实际影响,但如果我要对算法挑剔,我可能只在 alphaVal 超过某个阈值时执行“亮度”逻辑,以及颜色信息在图像的透明部分是没有意义的。话虽如此,真实照片很少有任何透明度,所以这可能不是问题。

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


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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-13
      • 1970-01-01
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      • 1970-01-01
      相关资源
      最近更新 更多