2017-02-15 56 views
0

我想知道是否可以使用Core Image對圖像進行二進制化(僅轉換爲黑白)?在iOS上使用Core Image上的二進制圖片

我跟OpenCV的和GPUImage做到了,但我們更希望它使用蘋果的核心形象,如果可能的話

+1

(原諒我張貼了這個意見作爲答案哎呀。)是的。檢查CIPhotoEffectMono(https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIPhotoEffectMono)。我還寫了一個自定義的CIColorKernel(GLSL代碼),可以「淡入」黑白。我會在幾分鐘後發佈這兩個答案。 – dfd

回答

3

是。您至少有兩個選項,CIPhotoEffectMono或小型自定義CIColorKernel。

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!) 
} 

注意,我趕緊寫這個,你可能需要收緊東西零回報。

CIColorKernel:

的FadeToBW GLSL(0.0因子全色,1.0因子是無顏色):

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); 
} 

下面的代碼打開此作爲被叫FadeToBW.cikernel文件。您也可以將其作爲字符串直接發佈到openKernelFile調用中。

雨燕代碼:

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!) 
} 

再次,加入一些衛士等

+0

嗨dfd,非常感謝您的快速響應!在嘗試定製內核解決方案時,在應用內核之後,我得到了「致命錯誤:意外地發現了零,同時展開了一個可選值」 - 你有一個想法,爲什麼? – Pascal

+0

我用下面的代碼:'''let ciKernel = CIColorKernel(string:「...」)!讓image = CIImage.init(image:inputImage)!使用參數= [inputImage,inputColorFade] let outputImage = ciKernel.apply(withExtent:extent,arguments:arguments)! let context = CIContext(options:nil) let cgimg = context.createCGImage(outputImage,from :((outputImage.extent)) return UIImage(cgImage:cgimg!)''' – Pascal

+1

啊。我的錯。未經測試的代碼從工作應用程序複製。它不是* inputImage *但* image *。我在編輯我的答案。出於測試目的,在apply(withExtent:arguments)上放置一個斷點並檢查沒有其他東西是零。 – dfd