我可以运行单个过滤器并创建多个过滤器链。当我需要混合多个操作的结果时,我的麻烦就开始了。我目前的用例是将CannyFilter覆盖在原始图像上。 canny和original都是独立过滤器链的一部分。我想要做的是将Canny结果(红线或绿线)覆盖在原始图像的50%alpha上。
50%不透明度的原始图像来自:
GPUImageSolidColorGenerator * white = [[GPUImageSolidColorGenerator alloc] init];
[white setColorRed:255 green:255 blue:255 alpha:1.0];
[white forceProcessingAtSize:self.view.frame.size];
[sourcePicture addTarget:alphaFilter];
[white addTarget:alphaFilter];
[sourcePicture processImage];
如何将上面的结果与倒置的Canny混合? 如果我的Canny输出可以是红色或绿色,则奖励积分。
答案 0 :(得分:2)
为此,我建议创建Canny边缘检测过滤器的自定义变体,或使用自定义过滤器修改其输出。
现在,当前实现过滤器的最后一个阶段输出不透明黑色(如果没有边缘)和不透明白色(如果有)。这使得在其他东西上混合或叠加它有点棘手。
要修改Canny边缘检测器,您可以从框架中复制它,将其重命名为您想要调用它的任何内容,复制GPUImageWeakPixelInclusionFilter(该过滤器中的最后一个阶段)并重命名它。修改新的Canny过滤器以指向在最后阶段调整并重命名的GPUImageWeakPixelInclusionFilter。在新的GPUImageWeakPixelInclusionFilter中,更改颜色输出,使其不再发出白色,而是发送边缘所需的颜色,并将黑色替换为您想要的非边缘颜色和不透明度。
更简单的替代方案,虽然效果稍差,但是创建一个自定义过滤器,只需将白色和黑色更改为您想要的任何颜色。它可以使用简单的步进功能来切换基于一个颜色分量(例如红色),如果通过则输出一种颜色,如果失败则输出另一种颜色。你只需要一个自定义着色器和一个GPUImageFilter实例来做到这一点。如果您只想修改输出的颜色,您甚至可以避免使用混合。