CIAreaHistogram inputScale因素(CIAreaHistogram input

2019-08-17 19:13发布

我建立一个使用应用程序CIAreaHistogram核心图像过滤器。 我使用inputCount 10用于测试值(桶的数目),以及inputScale值1。

我得到的CIImage的直方图本身,然后我通过一个定制的内核(看帖子的结尾)运行的alpha值设置为1(否则从直方图计算alpha值预乘),然后将其转换为NSBitmapImageRep

然后我通过图像rep的缓冲器扫描和打印的RGB值(跳过α值)。 然而,当我做到这一点,在整个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。我尝试了第二核心(看帖子的结尾),设置的所有像素为红色。 显然,绿色和蓝色值均为零。 不过,我检查从位图代表的值时,得到这样的结果:

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内核函数的副本。 首先,其设定的α1的一个:

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

而接下来,设置所有的像素之一RGB 255 0 0但最终255 43 25,一旦将其转换为NSBitmapImageRep

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;
}

在此先感谢您的帮助。

Answer 1:

你只需要一行代码使用自定义的核心图像过滤器(或当你正在创建一个新的CIImage对象或更换现有的一个)时生成和显示直方图:

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


文章来源: CIAreaHistogram inputScale factor