在内核例程规则的文档中,它说'内核例程通过使用逆映射回输入图像的相应像素来计算输出像素。虽然你可以用这种方式来表示大多数像素计算 - 一些比其他更自然 - 但是有一些图像处理操作,即使不是不可能,这也是很困难的。例如,计算直方图很难被描述为对源图像的逆映射。如何为CoreImage编写类似直方图的内核过滤器?
但是,苹果显然是这样做的,因为他们有一个CIAreaHistogram核心图像过滤器就是这么做的。
我可以看到一个理论方法与给定的限制做到这一点:
比方说你想要一个256元的红色通道直方图...
你有256x1像素输出图像。为这256个像素中的每一个调用内核函数。内核函数每次调用它时都必须读取整个图像中的每个像素,检查该像素的红色值是否与该桶相匹配并增加计数器。当它处理该输出像素的整个图像中的每个像素时,它将除以像素的总数并将该输出像素值设置为该计算值。问题是,假设它实际工作,这是非常低效的,因为每个输入像素都被访问256次,尽管每个输出像素只写入一次。
什么是最佳的将是内核遍历每个INPUT像素的方式,让我们根据该值更新任何输出像素。然后每个输入像素只能被读取一次,并且输出像素将被读取并且总共写入(输入宽度)x(输入高度)的总次数。
有谁知道有什么办法让这种过滤器工作?很显然苹果公司提供了一个过滤器来制作直方图,但我需要它来制作更有限的直方图。 (例如,蓝色直方图限于在给定范围内具有红色值的样本。)