CIAreaHistogram inputScale factor

Jus*_*kva 6 color-management core-image histogram cifilter

我正在构建一个使用CIAreaHistogramCore 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

RGB: 255 43 25
Run Code Online (Sandbox Code Playgroud)

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

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput];
unsigned char *buf = [bitmapRep bitmapData];
Run Code Online (Sandbox Code Playgroud)

一旦我将像素设置为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;
}
Run Code Online (Sandbox Code Playgroud)

接下来,将所有像素设置为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;
}
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

Jam*_*ush 0

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

return [CIFilter filterWithName:@"CIHistogramDisplayFilter" keysAndValues:kCIInputImageKey, self.inputImage, @"inputHeight", @100.0, @"inputHighLimit", @1.0, @"inputLowLimit", @0.0, nil].outputImage;
Run Code Online (Sandbox Code Playgroud)