用于合成红色、绿色和蓝色颜色通道的 CIFilter
Posted
技术标签:
【中文标题】用于合成红色、绿色和蓝色颜色通道的 CIFilter【英文标题】:CIFilters for compositing Red, Green, and Blue color channels 【发布时间】:2020-11-03 07:20:39 【问题描述】:我正在为图像构建一个“曲线”编辑器,并希望拆分每个颜色通道以通过 CIToneCurve
过滤器,然后再将它们重新组合成单个颜色图像。 (我知道CIColorCurves
过滤器,但这并没有给我想要的控制权。)
我可以使用三个单独的CIColorCube
过滤器来分离通道以生成 3 个单独的颜色通道,但我不确定如何将它们重新组合在一起以形成单色图像。
使用 maximumCompositingFilter
和 minimumCompositing
滤镜可以工作,但是当我通过 ToneCurve 运行单张彩色照片时,调整高点或低点(取决于我使用的合成滤镜)会弄乱颜色。
【问题讨论】:
您尝试过简单的添加剂混合吗?如果分离的图像在各自的通道中仍然具有颜色值,则将它们加在一起应该会再次生成完整的 RGB 图像。 【参考方案1】:您可以使用 Accelerate.vImage 来做到这一点。
Apple 有一篇文章讨论了将交错图像转换为单独的平面缓冲区:https://developer.apple.com/documentation/accelerate/optimizing_image_processing_performance
...还有一篇文章讨论了使用CIImageProcessorKernel
:https://developer.apple.com/documentation/accelerate/reading_from_and_writing_to_core_video_pixel_buffers 的 vImage / Core Image 互操作性。我不记得CIImageProcessorKernel
是否支持单通道8位图像,例如R8
。
...另外,这个 Apple 示例代码项目可能很有趣:Applying Tone Curve Adjustments to Images。
【讨论】:
【参考方案2】:最终使用了 Frank Schlegel 提出的建议并使用了简单的加法合成。我必须编写自己的 CIFilter 才能做到这一点,但这很简单。
half4 rgbaComposite(sample_h redColor, sample_h greenColor, sample_h blueColor, sample_h alphaColor)
return half4(redColor.r, greenColor.g, blueColor.b, alphaColor.a);
这适用于金属支持的 CIFilter。每个输入都假定它只包含一个颜色通道。
【讨论】:
您确定效果与 Mac 的 Photoshop 或照片应用程序中的效果相同吗? RGB 合成不是简单的红、绿、蓝叠加。您可以为每个 r、g、b 以及 rgb 复合曲线创建曲线。以上是关于用于合成红色、绿色和蓝色颜色通道的 CIFilter的主要内容,如果未能解决你的问题,请参考以下文章