用于合成红色、绿色和蓝色颜色通道的 CIFilter

Posted

技术标签:

【中文标题】用于合成红色、绿色和蓝色颜色通道的 CIFilter【英文标题】:CIFilters for compositing Red, Green, and Blue color channels 【发布时间】:2020-11-03 07:20:39 【问题描述】:

我正在为图像构建一个“曲线”编辑器,并希望拆分每个颜色通道以通过 CIToneCurve 过滤器,然后再将它们重新组合成单​​个颜色图像。 (我知道CIColorCurves 过滤器,但这并没有给我想要的控制权。)

我可以使用三个单独的CIColorCube 过滤器来分离通道以生成 3 个单独的颜色通道,但我不确定如何将它们重新组合在一起以形成单色图像。

使用 maximumCompositingFilterminimumCompositing 滤镜可以工作,但是当我通过 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的主要内容,如果未能解决你的问题,请参考以下文章

单通道和多通道影象的区别?

单通道和多通道图像的区别

photoshop中LAB是啥意思

通过强度值标准化颜色通道和图像,OpenCV

linux 文件夹的颜色代表啥意思

颜色rgb