我想在UIImage
中隔离某种颜色的元素,以便我可以在另一个工具中处理该图像。
假设我有以下图片,我想隔离所有红色元素。
输入:
所需输出:所有红色元素
我可以采取哪些措施来实现这一目标?我认为它是CIFilter
中的东西,但还没找到合适的过滤器。有没有直接的方法来实现这个目标?
答案 0 :(得分:1)
好的,得到了一些帮助并整理好了!以下是如何执行此操作:
// 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)