2017-02-15 23 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

はいだ場合は、Appleのコアイメージを使用することを好むだろう。少なくとも2つのオプション、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!) 
} 

注、私はすぐにこれを書いている、あなたはnilを返しますため、物事を引き締める必要があるかもしれません。

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:" ... ")! let image = CIImage.init(image:inputImage)! letエクステント= image.extent let arguments = [inputImage、inputColorFade] let outputImage = ciKernel.apply(withExtent:extent、arguments:arguments)! letコンテキスト= CIContext(オプション:なし) let cgimg = context.createCGImage(outputImage、from:(outputImage.extent)) 返信UIImage(cgImage:cgimg!) '' ' – Pascal

+1

Ah。私のせい。実行中のアプリケーションからコピーされた未テストコード。 * inputImage *ではなく* image *である。私は自分の答えを編集しています。テスト目的のために、適用(withExtent:引数)にブレークポイントを置き、それ以外は何もないことを確認してください。 – dfd

関連する問題