检测照片的清晰度

时间:2015-08-05 11:05:33

标签: ios image-processing core-image

我正在寻找一个有助于检测照片清晰度的框架。我已阅读this post,其中指出了这样做的方法。但我宁愿和图书馆一起工作也不愿意弄脏手。

在Core Image Apple的文档中说:

  

核心图像可以分析图像的质量,并提供一组具有最佳设置的滤镜,用于调整色调,对比度和色调等内容,以及校正闪光瑕疵(如红眼)。它通过一个方法调用完成所有这些。

如何进行'分析图像质量'部分?我很想看到一些示例代码。

3 个答案:

答案 0 :(得分:2)

执行此操作的最佳方法可能是Polar Edge Coherence指标:

Baroncini,V.,et al。 “The polar edge coherence: a quasi blind metric for video quality assessment.”EUSIPCO 2009,格拉斯哥(2009):564-568。

它对于图像和视频一样有效。这直接测量边缘的锐度。如果应用锐化滤镜,则可以比较前后值,如果超过锐化,则值将再次开始下降。它需要使用复杂值的内核进行几次卷积,如本文所述。

答案 1 :(得分:1)

我不认为Core Image会帮助你。您可以使用自动增强功能来获取建议的过滤器和值的数组。然而,没有锐度(边缘对比度)滤镜,只是整体图像对比度。请参阅full list here

Apple vDSP API可以进行快速傅里叶变换:

  

vDSP API为语音,声音,音频和视频处理,诊断医学成像,雷达信号处理,地震分析和科学数据处理等应用提供数学函数。

您应该可以使用它来分析您的图像。

有关概念性概述,请参阅:Using Fourier Transforms并在vDSP上搜索教程。堆栈上也有Q& A。

答案 2 :(得分:1)

我们使用GPUimage框架这样做(计算亮度和清晰度):(这里有一些可能对你有帮助的片段)

-(BOOL) calculateBrightness:(UIImage *) image {
float result  = 0;
int i = 0;
for (int y = 0; y < image.size.height; y++) {
    for (int x = 0; x < image.size.width; x++) {
        UIColor *color = [self colorAt:image
                                   atX:x
                                  andY:y];
        const CGFloat * colors = CGColorGetComponents(color.CGColor);
        float r = colors[0];
        float g = colors[1];
        float b = colors[2];
        result += .299 * r + 0.587 * g + 0.114 * b;
        i++;
    }
}
float brightness = result / (float)i;
NSLog(@"Image Brightness : %f",brightness);
if (brightness > 0.8 || brightness < 0.3) {
    return NO;
}
return YES;

}

-(BOOL) calculateSharpness:(UIImage *) image {
GPUImageCannyEdgeDetectionFilter *filter = [[GPUImageCannyEdgeDetectionFilter alloc] init];
BinaryImageDistanceTransform *binImagTrans = [[BinaryImageDistanceTransform alloc] init ];
NSArray *resultArray = [binImagTrans twoDimDistanceTransform:[self getBinaryImageAsArray:[filter imageByFilteringImage:image]]];

if (resultArray == nil) {
    return NO;
}

int sum = 0;
for (int x = 0; x < resultArray.count; x++) {
    NSMutableArray *col = resultArray[x];
    sum += (int)[col valueForKeyPath:@"@max.intValue"];
}

// Values under analysis
NSLog(@"Image Sharp : %i",sum);
if (sum < 26250000) { // tested - bad sharpness is under ca. 26250000
    return NO;
}
return YES;

}

但它很慢。需要大约iPad相机拍摄一张图片需要40秒。