我正在使用CIImage对象,试图获得饱和度值。但是我找不到获得图像饱和度的方法,至少使用 OS X
中可用的 CIFilter。是否可以使用标准CIFilter获得CIImage的饱和度?
看看CIColorControls
过滤器。使用此滤镜,可以调整图像的饱和度、亮度和对比度。
为了计算饱和度,此滤波器在 灰度图像(饱和度 = 0.0)和原始图像(饱和度 = 1.0)。筛选器支持外推:对于大于 1.0 的值,它会增加饱和度。
例:
CIFilter *colorControlsFilter = [CIFilter filterWithName:@"CIColorControls"];
[colorControlsFilter setDefaults];
[colorControlsFilter setValue:sourceImage forKey:@"inputImage"];
[colorControlsFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputSaturation"];
[colorControlsFilter setValue:[NSNumber numberWithFloat:0.2] forKey:@"inputBrightness"];
[colorControlsFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputContrast"];
CIImage *outputImage = [colorControlsFilter valueForKey:@"outputImage"];
▸ CIColorControls
此处参考。
▸ 所有信息都在这里。
你不能使用内置的CIFilter来做到这一点,但你可以非常简单地编码它。我不会给你完整的实现,但我可以给你完成这项工作的 cikernel :
vec4 rgbToHsv(vec4 rgb) {
float x = min(rgb.r, min(rgb.g, rgb.b));
float v = max(rgb.r, max(rgb.g, rgb.b));
float f = (rgb.r == x) ? rgb.g - rgb.b : ((rgb.g == x) ? rgb.b - rgb.r : rgb.r - rgb.g);
float i = (rgb.r == x) ? 3.0 : ((rgb.g == x) ? 5.0 : 1.0);
float h = i - (f / (v - x));
float s = (v - x) / v;
return (v == x) ? vec4(-1, 0, v, rgb.a) : vec4(h, s, v, rgb.a);
}
kernel vec4 saturationToGrayscale(sampler image) {
vec4 color = sample(image, samplerCoord(image));
vec4 hsv = rgbToHsv(color);
return premultiply(vec4(vec3(hsv.g), color.a));
}
rgbToHsv 函数来自 Andy Finnell 的博客
输出结果为灰度图像,其中白色表示坐 == 1.0,黑色表示坐 == 0.0。您可以通过在返回参数中使用"1.0-hsv.g"而不是"hsv.g"来还原此问题。您还可以分别使用 hsv.r 和 rsv.b 检索色调和值。
让它成为CIFilter留给你。看看苹果的创建自定义过滤器来做到这一点。上面的代码发生在 .cikernel 文件中。
RGB 图像转换为 YpCbCr 并更改cb
和cr
值来调整其饱和度。Accelerate.vimage 可以为您完成此转换,Apple 有一个示例代码项目在这里讨论该主题。
您可以将 vImage 操作包装在CIImageProcessorKernel
中,以使其可用于核心映像。同样,Apple有一篇文章在这里解释了如何做到这一点。
希望有帮助,
西蒙