1

我从GPUImage中的边缘检测滤镜得到了一张黑白图像,其中白色代表边缘,图像内容大部分是黑色的,不透明的。问题是,我想将此图像叠加在另一个图像之上,以显示边缘如何与下面的图像对齐。

但是非边缘区域不是透明而是黑色,所以基本上我希望黑色是透明的,或者将黑白色的强度改为透明的强度。

我没有找到用于此转换任务的直接 GPUImage 过滤器。GPUImageChromaKeyFilter 似乎是这样做的一种方式,但它不仅仅是 RGB 到 Alpha 通道的转换,并且不适用于此任务。

4

1 回答 1

3

编辑:感谢布拉德的评论,一个更有效的解决方案不交换频道是替换“gl_FragColor = vec4(vec3(mag), 1.0);” 用“gl_FragColor = vec4(mag);” 在边缘检测滤波器源中。

您可以使用 GPUImageColorMatrixFilter 中的参数,并将通道从一个映射到另一个。示例代码:

GPUImagePicture *gpuImage = [[GPUImagePicture alloc] initWithImage:image];
GPUImageSobelEdgeDetectionFilter *edgeFilter = [[GPUImageSobelEdgeDetectionFilter alloc] init];

GPUImageColorMatrixFilter *conversionFilter = [[GPUImageColorMatrixFilter alloc] init];
conversionFilter.colorMatrix = (GPUMatrix4x4){
    {0.0, 0.0, 0.0, 1.0},
    {0.0, 0.0, 0.0, 1.0},
    {0.0, 0.0, 0.0, 1.0},
    {1.0,0.0,0.0,0.0},
};

[gpuImage addTarget:edgeFilter];
[edgeFilter addTarget:conversionFilter];
[gpuImage processImage];

return [conversionFilter imageFromCurrentlyProcessedOutputWithOrientation:orientation];

colorMatrix 中指定的值基本上是说使用之前的 Alpha 通道(对于非透明图像全部为 255)来替换 RGB 通道,并使用之前的 R 通道(黑白图像在 RGB 中具有相同的值)来替换 Alpha 通道.

于 2013-05-30T21:01:48.687 回答