Detección de nitidez de una foto

Estoy buscando un marco que ayuda a detectar la nitidez de una foto. He leído esta publicación que apunta a la metodología de hacerlo. Pero prefiero trabajar con una biblioteca que ensuciarse las manos.

En la documentation de Core Image Apple dice:

Core Image puede analizar la calidad de una image y proporcionar un set de filters con configuraciones óptimas para ajustar cosas tales como el tono, el contraste y el color del tono, y para corregir artefactos de flash tales como ojos rojos. Hace todo esto con una llamada de método de su parte.

¿Cómo puedo hacer la parte 'analizar calidad de image'? Me encantaría ver un código de ejemplo.

Lo hicimos con el marco de trabajo de GPUimage como este (calcule el brillo y la nitidez): (aquí hay algunos fragments que pueden ayudarlo)

-(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; 

}

Pero es muy lento. Se necesita aprox. 40 segundos para una image de la camera del iPad.

Quizás la mejor manera de hacerlo es la métrica de Coinheritance de Polar Edge:

Baroncini, V., et al. " La coinheritance del borde polar: una métrica casi ciega para la evaluación de la calidad del video " . EUSIPCO 2009, Glasgow (2009): 564-568.

Funciona igual de bien para imágenes que para video. Esto mide directamente la nitidez de los bordes. Si aplica un filter de nitidez, puede comparar los valores de antes y después, y si agota los valores de nitidez, los valores comenzarán a descender nuevamente. Requiere hacer un par de circunvoluciones utilizando kernels de valor complejo como se describe en el documento.

No creo que Core Image te ayude. Puede usar la function de mejora automática para get una variedad de filters y valores propuestos. Sin embargo, no hay filter de nitidez (contraste de borde), solo el contraste general de la image. Vea la list completa aquí .

Hay una API de Apple vDSP que puede hacer transformaciones rápidas de Fourier:

La API vDSP proporciona funciones matemáticas para aplicaciones tales como procesamiento de voz, sonido, audio y video, diagnóstico por imágenes médicas, procesamiento de señal de radar, análisis sísmico y procesamiento de datos científicos.

Debería poder utilizarlo para analizar su image.

Para get una descripción conceptual, consulte: Uso de transformaciones de Fourier y búsqueda de tutoriales en vDSP. También hay preguntas y respuestas aquí en la stack.