2017-02-15 1 views
0

Je me demandais s'il était possible de binariser une image (convertir en noir et blanc seulement) avec Core Image?Binarize Image avec Core Image sur iOS

je l'ai fait avec OpenCV et GPUImage, mais je préfère à utiliser l'image d'Apple Core si cela est possible

+1

(. Pardonnez-moi j'ai posté ce commentaire comme une réponse Oops..) Oui. Recherchez CIPhotoEffectMono (https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIPhotoEffectMono). J'ai également écrit un CIColorKernel personnalisé (code GLSL) qui "s'estompe" en noir et blanc. Je posterai les deux comme une réponse dans quelques minutes. – dfd

Répondre

3

Oui. Vous avez au moins deux options, CIPhotoEffectMono ou un petit CIColorKernel personnalisé.

CIPhotoEffectMono:

func createMonoImage(image:UIImage) -> UIImage { 
    let filter = CIFilter(name: "CIPhotoEffectMono") 
    filter!.setValue(CIImage(image: image), forKey: "inputImage") 
    let outputImage = filter!.outputImage 
    let cgimg = ciCtx.createCGImage(outputImage!, from: (outputImage?.extent)!) 
    return UIImage(cgImage: cgimg!) 
} 

Remarque, je vous écris rapidement, vous devrez peut-être resserrer les choses pour les retours nul.

CIColorKernel:

Le FadeToBW GLSL (0,0 facteur couleur, facteur 1.0 est pas de couleur):

kernel vec4 fadeToBW(__sample s, float factor) { 
    vec3 lum = vec3(0.299,0.587,0.114); 
    vec3 bw = vec3(dot(s.rgb,lum)); 
    vec3 pixel = s.rgb + (bw - s.rgb) * factor; 
    return vec4(pixel,s.a); 
} 

Le code ci-dessous ouvre cela comme un fichier appelé FadeToBW.cikernel. Vous pouvez également l'afficher en tant que chaîne directement dans l'appel openKernelFile.

Le code Swift:

func createMonoImage(image:UIImage, inputColorFade:NSNumber) -> UIImage { 
    let ciKernel = CIColorKernel(string: openKernelFile("FadeToBW")) 
    let extent = image.extent 
    let arguments = [image, inputColorFade]   
    let outputImage = ciKernel.applyWithExtent(extent, arguments: arguments) 
    let cgimg = ciCtx.createCGImage(outputImage!, from: (outputImage?.extent)!) 
    return UIImage(cgImage: cgimg!) 
} 

Encore une fois, ajoutez quelques gardes, etc.

+0

Bonjour dfd, merci beaucoup pour votre réponse rapide! Lorsque j'essaie la solution du noyau personnalisé, je reçois une "erreur fatale: trouvé de manière inattendue lors du déballage d'une valeur optionnelle" après avoir appliqué le noyau - avez-vous une idée, pourquoi? – Pascal

+0

J'ai utilisé le code suivant: '' 'let ciKernel = CIColorKernel (string:" ... ")! let image = CIImage.init (image: inputImage)! let extent = image.extent laissez arguments = [inputImage, inputColorFade] laissez outputImage = ciKernel.apply (withExtent: extent, arguments: arguments)! let context = CIContext (options: zéro) let cgimg = contexte.createCGImage (outputImage, de: (outputImage.extent)) return UIImage (cgImage: cgimg!) '' ' – Pascal

+1

Ah. Ma faute. Code non testé copié à partir d'une application qui fonctionne. Ce n'est pas * inputImage * mais * image *. Je suis en train d'éditer ma réponse. Pour tester, mettez un point d'arrêt sur apply (withExtent: arguments) et vérifiez que rien d'autre n'est nul. – dfd