使用CIFilters进行CIImage饱和,是否可能?

时间:2012-10-05 17:26:25

标签: objective-c cifilter ciimage

我正在使用CIImage对象,试图获得饱和度值。但我无法找到获得图像饱和度的方法,至少使用OS X中提供的CIFilter 是否可以使用标准CIFilter来获得CIImage的饱和度?

3 个答案:

答案 0 :(得分:3)

查看CIColorControls过滤器。使用此滤镜可以调整图像的饱和度,亮度和对比度。

  

要计算饱和度,此滤波器在a之间进行线性插值   灰度图像(饱和度= 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参考here
▸所有CIFilters here

答案 1 :(得分:0)

使用内置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's blog

输出结果是灰度图像,其中白色表示sat == 1.0,黑色表示sat == 0.0。您可以在return参数中使用“1.0-hsv.g”而不是“hsv.g”来恢复此操作。 您还可以分别使用hsv.r和rsv.b来检索色调和值。

让它成为CIFilter留给你。看看Apple的Creating Custom Filters来做这件事。上面的代码发生在.cikernel文件中。

答案 2 :(得分:0)

您可以通过将RGB图像转换为YpCbCr并更改cbcr的值来调整其饱和度。 Accelerate.vimage可以为您完成此转换,Apple提供了一个示例代码项目来讨论该主题here

您可以将vImage操作包装在CIImageProcessorKernel中,以使其对Core Image可用。同样,Apple有一篇文章介绍了如何进行here

希望有帮助,

simon