2017-02-15 5 views
0

코어 이미지를 사용하여 이미지를 이진화 (흑백 변환 만 가능) 할 수 있는지 궁금합니다.iOS의 코어 이미지가있는 이미지의 이진화

나는 OpenCV의와 GPUImage로했다,하지만 가능하다면, 애플 코어 이미지를 사용하도록 선호

+1

이 (. 용서 내가 대답으로이 댓글을 게시 아차..) 예. CIPhotoEffectMono (https://developer.apple.com/library/content/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html#//apple_ref/doc/filter/ci/CIPhotoEffectMono)를 확인하십시오. 나는 또한 흑백으로 페이드 (fade)하는 커스텀 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, 빠른 답변을 많이 주셔서 감사합니다! 맞춤 커널 솔루션을 시도 할 때 "치명적인 오류가 발생합니다 : 커널을 적용한 후 선택 값을 언 래핑하는 동안 예기치 않게 nil이 발견되었습니다"라는 생각이 들었습니다. 이유가 무엇입니까? – Pascal

+0

다음 코드를 사용했습니다 :'''let ciKernel = CIColorKernel (string : "...")! let image = CIImage.init (image : inputImage)! let extent = image.extent let = [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 *입니다. 나는 내 대답을 편집 중입니다. 테스트 목적으로 적용 (withExtent : 인수)에 중단 점을 넣고 아무것도없는 것을 확인합니다. – dfd

관련 문제