Comment mettre en œuvre rapide des filtres d'image sur la plate-forme iOS
Je suis en train de travailler sur une application iOS où l'utilisateur peut appliquer une série de filtres photo. Chaque filtre est essentiellement un ensemble de scripts Photoshop avec des paramètres spécifiques. Cette action sont les suivants:
- Réglage des niveaux
- Luminosité /Contraste
- Teinte /Saturation
- Uniques et multiples en superposition
Je l'ai répété toutes ces actions dans mon code à l'aide des expressions arithmétiques en parcourant l'ensemble des pixels de l'image. Mais quand je lance mon application sur iPhone 4, chaque filtre prend environ 3 à 4 secondes pour appliquer ce qui est tout à fait un peu de temps pour l'utilisateur d'attendre. La taille de l'image 640 x 640 px qui est @2x de mon point de vue taille, car elle est affichée sur un écran Retina. J'ai trouvé que mon principal problème est que les niveaux des modifications qui sont l'appel de la pow() fonction C chaque fois que j'ai besoin d'ajuster le gamma. Je suis à l'aide de flotteurs pas de doubles, bien sûr, parce que ARMv6 et ARMv7 sont lents avec des doubles. Essayé d'activer et de désactiver le Pouce et obtenu le même résultat.
Exemple de la plus simple filtre dans mon application qui s'exécute assez rapidement si (2 secondes). Les autres filtres comprend plusieurs expressions et pow() appelle ce qui le rend lent.
https://gist.github.com/1156760
J'ai vu quelques solutions qui sont à l'aide d'Accélérer Cadre vDSP transformations de matrice rapide d'images modifications. J'ai aussi vu OpenGL ES solutions. Je ne suis pas sûr qu'ils sont en mesure de mes besoins. Mais probablement c'est juste une question de traduire ma série de changements dans certains bonne matrice de convolution?
Tout conseil serait utile.
Merci,
Andrey.
- Vous devriez poster cette question sur les Forums des Développeurs Apple ainsi.
Vous devez vous connecter pour publier un commentaire.
Pour le filtre dans votre exemple de code, vous pouvez utiliser une table de recherche pour le rendre beaucoup plus rapide. Je suppose que votre image d'entrée est de 8 bits par couleur et conversion de flotter avant de passer à cette fonction. Pour chaque couleur, cela ne donne 256 valeurs possibles et, par conséquent, seulement 256 possible les valeurs de sortie. Vous pourriez précalculer les ces et les stocker dans un tableau. Cela permettrait d'éviter le
pow()
calcul et la vérification des limites, car vous pourriez facteur dans le précalcul.Il ressemblerait à quelque chose comme ceci:
Dans ce cas, vous n'avez qu'à effectuer
pow()
256 fois au lieu de 3*640*640 fois. Vous permettra également d'éviter de ramification causée par la vérification des limites dans l'image principale de la boucle de ce qui peut être coûteux. Vous n'auriez pas à convertir à flotter.Même un moyen plus rapide peut être à précalculer la table à l'extérieur du programme et vient de mettre la 256 coefficients dans le code.
Aucune des activités que vous avez énumérés, il devrait exiger une convolution ou même d'une matrice se multiplier. Ils sont tous les pixel-sage des opérations, ce qui signifie que chaque pixel de sortie ne dépend que de la seule entrée correspondante pixel. Vous devez envisager de convolution pour des opérations comme le flou ou de la netteté où plusieurs d'entrée pixels affecter un seul pixel de sortie.
Si vous êtes à la recherche de l'absolu moyen le plus rapide pour ce faire, vous allez vouloir utiliser le GPU pour gérer le traitement. Il est construit pour faire massivement parallèle des opérations, comme la couleur des ajustements sur les pixels.
Comme je l'ai mentionné dans d'autres réponses, j'ai mesuré une 14X - 28X amélioration des performances lors de l'exécution d'une opération de traitement d'image en utilisant OpenGL ES au lieu de sur le CPU. Vous pouvez utiliser l'Accélérer cadre plus vite sur les CPU de manipulation de l'image (je crois que Apple affirme autour d'un ~4-5X boost est possible ici), mais il ne sera pas aussi rapide que l'OpenGL ES. Il peut être plus facile à mettre en œuvre, cependant, c'est pourquoi j'ai utilisé parfois Accélérer sur OpenGL ES.
iOS 5.0 apporte également plus de Core Image à partir du bureau, ce qui vous donne une belle wrapper autour de ce genre de sur-GPU réglage de l'image. Cependant, il existe certaines limitations à l'iOS de Base de l'Image mise en œuvre que vous n'avez pas lorsque vous travaillez avec OpenGL ES 2.0 shaders directement.
Je présente un exemple d'un OpenGL ES 2.0 shader filtre d'image dans mon article ici. La partie la plus difficile au sujet de faire ce genre de traitement est d'obtenir l'OpenGL ES échafaudage mis en place.
à l'Aide de mon exemple d'application, vous devriez être en mesure de l'extrait de code de configuration et d'appliquer vos propres filtres de l'utiliser.Pour rendre cela plus facile, j'ai créé un framework open source appelé GPUImage qui gère l'ensemble de l'OpenGL ES de l'interaction pour vous. Il a presque chaque filtre vous liste ci-dessus, et la plupart exécuter en moins de 2,5 ms pour une 640x480 image de la vidéo sur un iPhone 4, ils sont donc beaucoup plus rapide que ce que traitées sur le CPU.Comme je l'ai dit dans un commentaire, vous devriez poster cette question sur le Développeur officiel d'Apple Forums.
Cela de côté, un réel contrôle rapide: faites-vous appel à
pow( )
oupowf( )
? Même si vos données sontfloat
, appelantpow( )
vous obtiendrez le double précision bibliothèque de mathématiques de la fonction, ce qui est nettement plus lent que la simple précision variantepowf( )
(et vous aurez à payer un supplément pour la conversion entrefloat
etdouble
ainsi).Et une deuxième vérification: avez-vous profilé vos filtres dans les Instruments? Avez-vous réellement savoir où le temps d'exécution est passé, ou êtes-vous deviner?
En fait, je voulais faire tout cela moi-même, mais j'ai trouvé Silverberg est Les Filtres D'Image. Vous pouvez appliquer différents instagram type d'image filtres sur vos images. Ce tellement mieux que les autres filtres d'image, il GLImageProcessing ou Cimg.
Également vérifier Instagram Filtres d'Image sur l'iPhone.
Espère que cela aide...
À partir de iOS 5 vers le haut, vous pouvez utiliser la Base de filtres d'Image pour régler une bonne gamme de paramètres de l'image.
Pour ajuster le contraste, par exemple, ce code fonctionne comme un charme:
N. B. valeur par Défaut pour le contraste est de 1,0 (valeur maximale suggérée est de 4,0).
Aussi, le contraste est calculé ici sur la imageView de l'image, de sorte que l'appel de cette méthode à plusieurs reprises pour cumuler le contraste. Ce qui signifie, si vous appelez cette méthode avec la valeur de contraste 2.0 d'abord, puis de nouveau avec la valeur de contraste 3.0, vous obtiendrez l'image d'origine avec un contraste de valeur ont augmenté de 6,0 (2.0 * 3.0) - pas de 5.0.
Vérifier la La documentation d'Apple de plus les filtres et les paramètres.
À la liste de tous les filtres disponibles et les paramètres dans le code, il suffit d'exécuter cette boucle:
C'est un vieux thread, mais j'ai obtenu à partir d'un autre lien, et donc les gens toujours le lire.
Avec iOS 5, Apple a ajouté le support de Base de l'Image, et un nombre décent de Base de filtres d'image. Je suis sûr que toutes celles que l'OP mentionnés sont disponibles
Core Image utilise OpenGL shaders sous les couvertures, il est donc très rapide. Il est beaucoup plus facile à utiliser que OpenGL cependant. Si vous n'avez pas de travail en OpenGL, et vous voulez juste pour appliquer des filtres à CGImage ou UIIMage objets de Base de filtres d'Image sont la voie à suivre.