【问题标题】:Detection of sharpness of a photo检测照片的清晰度
【发布时间】:2015-08-20 16:12:51
【问题描述】:

我正在寻找一个有助于检测照片清晰度的框架。我已经阅读了this post,它指出了这样做的方法。但我宁愿在图书馆工作,也不愿亲自动手。

在 Core Image Apple 的文档中说:

Core Image 可以分析图像的质量,并提供一组具有最佳设置的滤镜,用于调整色调、对比度和色调等内容,以及校正红眼等闪光伪影。它通过您的一个方法调用完成所有这一切。

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

【问题讨论】:

  • 取下地球仪,准备好迎接肮脏的生活!!对图像应用滤镜非常简单,去吧!
  • 要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题不属于 Stack Overflow 的主题。

标签: ios image-processing core-image


【解决方案1】:

也许最好的方法是使用 Polar Edge Coherence 指标:

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

它同样适用于图像和视频。这直接测量边缘的清晰度。如果您应用锐化过滤器,您可以比较之前和之后的值,如果过度锐化,值将再次开始下降。如论文所述,它需要使用复值内核进行几次卷积。

【讨论】:

    【解决方案2】:

    我们用这样的 GPUimage 框架完成了它(计算亮度和锐度):(这里有一些可能对你有帮助的 sn-ps)

    -(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 秒。

    【讨论】:

    • 什么是 BinaryImageDistanceTransform?我在 GPUImage 库中找不到它
    【解决方案3】:

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

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

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

    您应该能够使用它来分析您的图像。

    有关概念性概述,请参阅:Using Fourier Transforms 并搜索有关 vDSP 的教程。堆栈上也有问答。

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 2020-08-20
      • 2020-04-25
      • 2011-10-29
      • 2011-10-02
      • 1970-01-01
      • 2023-02-25
      • 2013-06-02
      • 2011-07-29
      相关资源
      最近更新 更多