cocoa - 制作一个 CoreImage 过滤器而不是对所有行像素求和,类似于 CIRowAverage?

标签 cocoa core-image cifilter

我目前正在 CPU 上运行代码,对灰度 NSImage 的列和行进行求和(即只有 1 个samplePerPixel)。我想我会尝试将代码移至 GPU(如果可能的话)。我发现了一个CoreImage滤镜CIRowAverageCIColumnAverage这看起来很相似。

在 Apple 文档中编写 custom Core Image filters他们说,

Keep in mind that your code can’t accumulate knowledge from pixel to pixel. A good strategy when writing your code is to move as much invariant calculation as possible from the actual kernel and place it in the Objective-C portion of the filter.

这暗示人们可能无法使用过滤器内核对像素进行求和。如果是这样,上述函数如何获得一个区域的平均值?

所以我的问题是,实现对图像的行或列求和以获得像素总值的最佳方法是什么。我应该坚持使用 CPU 吗?

最佳答案

核心图像过滤器通过一系列缩减来执行此平均。团队中的一位前工程师描述了如何在 this GPU Gems chapter 中为 CIAreaAverage 过滤器完成此操作。 (根据第 26.2.2 节“寻找质心”)。

我通过减少 my answer here 来谈论类似的平均。 。我在 iOS 上需要这种功能,因此我编写了一个片段着色器,将图像在水平和垂直维度上缩小了四倍,在像素之间进行采样,以便在每一步将十六个像素平均为一个。一旦图像缩小到足够小的尺寸,剩余的像素就会被读出并平均以产生单个最终值。

这种减少在 GPU 上执行起来仍然非常快,而且我能够在 iPhone 4 上的约 6 毫秒内从 640x480 视频帧中提取平均颜色。当然,您将拥有更多的马力在 Mac 上玩。

您可以采取类似的方法,在每一步中仅向一个方向或另一个方向减少。如果您有兴趣获得像素值的总和,则需要注意 GPU 上使用的像素格式的精度限制。默认情况下,RGBA 颜色值存储为 8 位值,但某些 GPU 上的 OpenGL (ES) 扩展可以使您能够渲染为 16 位甚至 32 位浮点纹理,从而扩展动态范围。我不确定,但我相信 Core Image 可以让您在 Mac 上使用 32 位 float 组件。

关于cocoa - 制作一个 CoreImage 过滤器而不是对所有行像素求和,类似于 CIRowAverage?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14453633/

相关文章:

ios - 使用 CIFilter 后图像自动旋转

ios - 使用 Core Image 渲染随机噪声 CALayer 会生成奇怪的伪像

objective-c - 将 ARC 代码转换为非 ARC

objective-c - 在表格 View 中显示图像单元格

ios - 将图像从 xcode Playground 快速保存到资源文件夹

swift - Core Image 过滤后的图像从 iOS 10 上的 UIImageView 中跳出

ios - 如何在图像像素上应用 CIFilter

objective-c - 在 Mac 应用程序中连接到 Internet

objective-c - 有没有办法运行两个或多个 NSTasks?

ios - 如何从 Swift 中的字符串生成条形码?