2016-07-22 42 views
0

在内核例程规则的文档中,它说'内核例程通过使用逆映射回输入图像的相应像素来计算输出像素。虽然你可以用这种方式来表示大多数像素计算 - 一些比其他更自然 - 但是有一些图像处理操作,即使不是不可能,这也是很困难的。例如,计算直方图很难被描述为对源图像的逆映射。如何为CoreImage编写类似直方图的内核过滤器?

但是,苹果显然是这样做的,因为他们有一个CIAreaHistogram核心图像过滤器就是这么做的。

我可以看到一个理论方法与给定的限制做到这一点:

比方说你想要一个256元的红色通道直方图...

你有256x1像素输出图像。为这256个像素中的每一个调用内核函数。内核函数每次调用它时都必须读取整个图像中的每个像素,检查该像素的红色值是否与该桶相匹配并增加计数器。当它处理该输出像素的整个图像中的每个像素时,它将除以像素的总数并将该输出像素值设置为该计算值。问题是,假设它实际工作,这是非常低效的,因为每个输入像素都被访问256次,尽管每个输出像素只写入一次。

什么是最佳的将是内核遍历每个INPUT像素的方式,让我们根据该值更新任何输出像素。然后每个输入像素只能被读取一次,并且输出像素将被读取并且总共写入(输入宽度)x(输入高度)的总次数。

有谁知道有什么办法让这种过滤器工作?很显然苹果公司提供了一个过滤器来制作直方图,但我需要它来制作更有限的直方图。 (例如,蓝色直方图限于在给定范围内具有红色值的样本。)

回答

1

问题在于Core Image中的自定义内核代码像一个逐像素重新映射的函数一样工作。除了当前正在计算的像素之外,实际上并没有大量的信息可用。自定义的核心图像过滤排序是这样的

for i in 1 ... image.width 
    for j in 1 ... image.height 
     New_Image[i][j] = CustomKernel(Current_Image[i][j]) 
    end 
end 

因此,实际上,这不是真的可信通过定制内核,以使自己的直方图,因为你从字面上没有过比在CustomKernel其他新图像的任何控制功能已经完成。这实际上是为iOS10创建CIImageProcessor的原因之一,您可能会更容易通过该功能制作直方图(并且还会通过图像处理生成其他很酷的效果),并且我建议您查看其上的WWDC 2016视频(原始图像和实时图像会话)。

IIRC,如果你真的想做一个直方图,它仍然是可能的,但你将不得不使用UIImage版本,然后将生成的图像转换为可以进行计数的RBG图像,并且将它们存储在垃圾箱中。我会推荐Simon Gladman的书,因为他有一章致力于直方图,但是有更多内容进入核心图像默认版本,因为他们对图像的控制比我们使用框架更多。