2017-06-08 10 views
0

UIImageで特定の色の要素を分離したいので、その画像を別のツールで処理することができます。UIImage/CIImageでどのように単一の色を分離できますか?

次のイメージがあり、すべての赤い要素を分離したいとします。

入力:

enter image description here

所望の出力:すべての赤の要素私はこれを達成するために取ることができますどのような手順

enter image description here

?私はそれがCIFilterの何かになると思ったが、まだ適切なフィルタが見つかりませんでした。これを達成するための簡単な方法はありますか?

答えて

0

申し訳ありませんが、いくつかの助けを借りてそれを整理してください!これを行う方法は次のとおりです。

// First, turn our UIImage into a CIImage 
let ciImage = CIImage(image: image)! 

// Next, let's make a CIVector for the color we want. 
let colorToIsolate = CIVector(x: 0.239, y: 0.951, z: 0.937) // normalized RGB 

// OK, here's where it gets interesting. 
// We're going to write a CIColorKernel that maps every pixel in the image. 
// If it's the color we want, then we turn it white, otherwise, black. 
// This is iOS-10 friendly; in iOS 11 there's a non-string-based way, 
// which helps with compiler type-checking and non-runtime error detection. 
// NOTE: The 0.5 value is a tolerance; adjust and adapt it to your needs for your task. 
// I was surprised that we needed it that large to get the desired effect; 
// had hoped that I could use a tighter value like 0.01 

let kernelString = "kernel vec4 filterColorMatch(sampler image, vec3 match) {" + 
     "vec2 dc = destCoord();" + 
     "vec3 color = sample(image, samplerTransform(image, dc)).rgb; " + 
     "return distance(color, match) < 0.5 ? vec4(1,1,1,1) : vec4(0,0,0,1); }" 

let colorIsolate = CIColorKernel(string: kernelString) 

// Now we can run our kernel, and extract the image! 
let after = colorIsolate?.apply(
    withExtent: ciImage.extent, 
    arguments: [ciImage, colorToIsolate] 
) 

let result = UIImage(ciImage: after) 
関連する問題