我目前正在使用Accelerate和Metal着色器计算直方图,波形和矢量图。此代码适用于8位SDR像素缓冲区,并且可以工作。我想使用Core Image重写它们,以便它们可以用于10位HDR和SDR缓冲区。
- Accelerate非常适合8位图像的直方图。但它不支持10位YCbCr像素缓冲区。CoreImage支持它,但不清楚如何从
CIAreaHistogram
输出中获取原始直方图数据,以便使用CoreGraphics或MTKView显示它。内置直方图CIHistogramDisplayFilter
显示直方图的灵活性较低。除了RGB,我还想要亮度直方图。
1.我在Metal着色器中使用atomic_fetch_add_explicit
来计算波形和矢量图等统计数据。似乎Metal核心图像内核不支持原子。有没有办法在CoreImage中做同样的事情?
1条答案
按热度按时间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的值可能非常小而失去精度。