CIAreaHistogram + CIHistogramDisplayFilter获得Luminance ONLY直方图

时间:2015-06-22 22:49:48

标签: ios macos histogram core-image luminance

我相信这可能与iOS和Mac OS中的Core Image相关。

我能够在Core Image中使用CIAreaHistogram + CIHistogramDisplayFilter显示RGB直方图。有没有办法单独使用LUMINANCE而不是RGB?

2 个答案:

答案 0 :(得分:1)

如果你已经创建了一个CIImage对象(ciImage),这里是如何生成直方图图像(iOS和Mac OS X):

ciImage = [CIFilter filterWithName:@"CIAreaHistogram" keysAndValues:kCIInputImageKey, ciImage, @"inputExtent", ciImage.extent, @"inputScale", [NSNumber numberWithFloat:1.0], @"inputCount", [NSNumber numberWithFloat:256.0], nil].outputImage;
ciImage = [CIFilter filterWithName:@"CIHistogramDisplayFilter" keysAndValues:kCIInputImageKey, ciImage, @"inputHeight", [NSNumber numberWithFloat:100.0], @"inputHighLimit", [NSNumber numberWithFloat:1.0], @"inputLowLimit", [NSNumber numberWithFloat:0.0], nil].outputImage;

有一百种不同的解决方案用于显示直方图;这很简单(只需两行代码),无处不在,无处不在。

打开仅输出彩色图像的亮度通道,并将其传递给与直方图相关的滤镜...

您知道如何创建返回CIKernel(或CIColorKernel)对象输出的自定义Core Image过滤器吗?如果没有,你应该;而且,我很乐意为您提供易于理解的说明。

假设你这样做,这里是OpenGL ES代码,它只返回它处理的图像的亮度值:

vec4 rgb2hsl(vec4 color)
{
    //Compute min and max component values
    float MAX = max(color.r, max(color.g, color.b));
    float MIN = min(color.r, min(color.g, color.b));

    //Make sure MAX > MIN to avoid division by zero later
    MAX = max(MIN + 1e-6, MAX);

    //Compute luminosity
    float l = (MIN + MAX) / 2.0;

    //Compute saturation
    float s = (l < 0.5 ? (MAX - MIN) / (MIN + MAX) : (MAX - MIN) / (2.0 - MAX - MIN));

    //Compute hue
    float h = (MAX == color.r ? (color.g - color.b) / (MAX - MIN) : (MAX == color.g ? 2.0 + (color.b - color.r) / (MAX - MIN) : 4.0 + (color.r - color.g) / (MAX - MIN)));
    h /= 6.0;
    h = (h < 0.0 ? 1.0 + h : h);

    return vec4(h, s, l, color.a);
}

kernel vec4 hsl(sampler image)
{
    //Get pixel from image (assume its alpha is 1.0 and don't unpremultiply)
    vec4 pixel = unpremultiply(sample(image, samplerCoord(image)));

    //Convert to HSL; only display luminance value
    return premultiply(vec4(vec3(rgb2hsl(pixel).b), 1.0));
}

以上是Apple开发人员最初编写的OpenGL ES代码;我修改它只显示亮度值。

同样:如果您不知道如何将内核插入到自定义Core Image过滤器中,请了解具体方法。我可以告诉你。

答案 1 :(得分:-2)

是的,也非常漂亮。这个应用程序将为您提供创建图表外观的快速入门,以及使用Apple框架及其API将其添加到您的应用程序的Objective-C代码:

http://www.infragistics.com/products/ios

我现在正在做同样的事情,所以我很想知道你是怎么过来的。请保持联系。