我从GPUImage中的边缘检测滤镜得到了一张黑白图像,其中白色代表边缘,图像内容大部分是黑色的,不透明的。问题是,我想将此图像叠加在另一个图像之上,以显示边缘如何与下面的图像对齐。
但是非边缘区域不是透明而是黑色,所以基本上我希望黑色是透明的,或者将黑白色的强度改为透明的强度。
我没有找到用于此转换任务的直接 GPUImage 过滤器。GPUImageChromaKeyFilter 似乎是这样做的一种方式,但它不仅仅是 RGB 到 Alpha 通道的转换,并且不适用于此任务。
我从GPUImage中的边缘检测滤镜得到了一张黑白图像,其中白色代表边缘,图像内容大部分是黑色的,不透明的。问题是,我想将此图像叠加在另一个图像之上,以显示边缘如何与下面的图像对齐。
但是非边缘区域不是透明而是黑色,所以基本上我希望黑色是透明的,或者将黑白色的强度改为透明的强度。
我没有找到用于此转换任务的直接 GPUImage 过滤器。GPUImageChromaKeyFilter 似乎是这样做的一种方式,但它不仅仅是 RGB 到 Alpha 通道的转换,并且不适用于此任务。
编辑:感谢布拉德的评论,一个更有效的解决方案不交换频道是替换“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 通道.