CIAreaHistogram inputScale factor

时间:2013-03-20 19:29:47

标签: histogram core-image cifilter color-management

我正在构建一个使用CIAreaHistogram Core Image过滤器的应用程序。我使用10 inputCount值(桶数)进行测试,inputScale值为1。

我得到直方图本身的CIImage,然后我通过自定义内核运行(参见结尾)将alpha值设置为1(因为否则直方图计算的alpha值被预乘)和然后将其转换为NSBitmapImageRep

然后我扫描图像代表的缓冲区并打印RGB值(跳过alpha值)。但是,当我这样做时,10中R,G和B值的总和不一定总计为255。

例如,对于全黑图像,我应用直方图,然后应用自定义内核,并获得以下输出:

RGB: 255 255 255
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0
RGB: 0 0 0

这是我所期望的,因为所有像素都是黑色的,所以一切都在第一桶中。但是,如果我使用彩色图像运行相同的算法,我会得到以下结果:

RGB: 98 76 81
RGB: 164 97 87
RGB: 136 161 69
RGB: 100 156 135
RGB: 80 85 185
RGB: 43 34 45
RGB: 31 19 8
RGB: 19 7 3
RGB: 12 5 2
RGB: 16 11 11

添加R,G和B的值 - 它们最多不加255.这会导致问题,因为我需要比较其中两个直方图,而我的算法希望总和在0到255之间。我显然可以扩展这些值,但出于性能原因,我想避免这一额外步骤。

我注意到其他一些有趣的东西可能会给出一些关于为什么会发生这种情况的线索。在我的自定义内核中,我只是将alpha值设置为1.我尝试了第二个内核(请参阅文章末尾),将所有像素设置为红色。显然,绿色和蓝色值为零。但是,在检查位图rep:

中的值时,我得到了这个结果
RGB: 255 43 25

但我只是将G和B设为零!这似乎是问题的一部分,表明颜色管理。但是因为我在内核中显式设置了值,所以只有一个代码块可以发生 - 从CIImage转换为NSBitmapImageRep:

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput];
unsigned char *buf = [bitmapRep bitmapData];

一旦我将像素设置为RGB 255 0 0,然后执行那些行,然后读取缓冲区,RGB值全部为255 43 25.我进一步尝试设置原始CGImageRef的颜色空间,整个工作流程基于kCGColorSpaceGenericRGB,认为颜色配置文件可能正在进行,但无济于事。

有谁可以告诉我为什么CIFilter内核会以这种方式运行,以及我如何解决它?

如前所述,这里是我使用的CIFilter内核函数的副本。首先,将alpha设置为1:

kernel vec4 adjustHistogram(sampler src)
{
    vec4 pix = sample(src, destCoord());
    pix.a = 1.0;
    return pix;
}

接下来,将所有像素设置为RGB 255 0 0,但一旦转换为NSBitmapImageRep就结束255 43 25:

kernel vec4 adjustHistogram(sampler src)
{
    vec4 pix = sample(src, destCoord());
    pix.r = 1.0; pix.g = 0.0; pix.b = 0.0;
    pix.a = 1.0;
    return pix;
}

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

使用自定义Core Image过滤器时(或者无论何时创建新的CIImage对象或替换现有的CIImage对象),您只需要一行代码来生成和显示直方图:

return [CIFilter filterWithName:@"CIHistogramDisplayFilter" keysAndValues:kCIInputImageKey, self.inputImage, @"inputHeight", @100.0, @"inputHighLimit", @1.0, @"inputLowLimit", @0.0, nil].outputImage;