ios 用于图像统计的Metal Core图像内核

ubof19bj  于 11个月前  发布在  iOS
关注(0)|答案(1)|浏览(123)

我目前正在使用Accelerate和Metal着色器计算直方图,波形和矢量图。此代码适用于8位SDR像素缓冲区,并且可以工作。我想使用Core Image重写它们,以便它们可以用于10位HDR和SDR缓冲区。

  1. Accelerate非常适合8位图像的直方图。但它不支持10位YCbCr像素缓冲区。CoreImage支持它,但不清楚如何从CIAreaHistogram输出中获取原始直方图数据,以便使用CoreGraphics或MTKView显示它。内置直方图CIHistogramDisplayFilter显示直方图的灵活性较低。除了RGB,我还想要亮度直方图。
    1.我在Metal着色器中使用atomic_fetch_add_explicit来计算波形和矢量图等统计数据。似乎Metal核心图像内核不支持原子。有没有办法在CoreImage中做同样的事情?
xv8emn3q

xv8emn3q1#

对于直方图,我认为您有两种选择:
1.您可以编写自己的直方图可视化内核,类似于CIHistogramDisplayFilter所做的。您可以将RGB和亮度直方图传递给它,并根据您的喜好将其可视化。
1.计算直方图(例如,使用CIAreaHistogram)并将结果渲染到位图缓冲区中。然后,您可以从该缓冲区读取bin值并将其可视化为自定义UI组件,例如,使用SwiftUI。在Github上的CoreImageExtensions库中,我们也有一些方便的API用于从CIImage中阅读值,这可能会简化此过程。
关于原子:如果你已经有了一个可以实现这些统计数据的Metal实现,我建议你围绕它编写一个CIImageProcessorKernel。它就是为了这个目的而设计的:将自定义图像处理器包含到Core Image管道中。特别是使用Metal非常方便,因为你已经有了一个Metal设备,纹理和命令缓冲区。
关于CIAreaHistogram的详细信息:
CIAreaHistogram过滤器的输出是一个1像素高、inputCount指定宽度的图像。inputCount指定直方图中希望包含多少个bin。输出中的每个像素包含落入相应bin的像素的 * 百分比 *,由通道分隔。
例如,如果将inputCount设置为2(即两个bin),输出图像如下所示:[(0.3, 0.6, 0.2, 0.0), (0.7, 0.4, 0.8, 1.0)],这意味着所有红色值的30%落入第一个bin,70%落入第二个bin;所有绿色值的60%落入第一个bin,40%落入第二个bin;依此类推。
请注意,默认情况下,所有bin中每个通道的值之和为1.0。但是,您可以使用inputScale参数进行更改,将所有值乘以一个因子。这是有意义的,特别是当您有一个较大的inputCount时,增加inputScale不会因为每个bin的值可能非常小而失去精度。

相关问题