在 GPUImage 中将黑白图像转换为透明和白色图像? RGB -> Alpha 基本上
Posted
技术标签:
【中文标题】在 GPUImage 中将黑白图像转换为透明和白色图像? RGB -> Alpha 基本上【英文标题】:Convert a black & white image to a transparent & white image in GPUImage? RGB -> Alpha basically 【发布时间】:2013-05-30 21:01:48 【问题描述】:我从 GPUImage 中的边缘检测滤镜得到了一张黑白图像,其中白色代表边缘,图像内容大部分是黑色的,不透明。问题是,我想将此图像叠加在另一个图像之上,以显示边缘如何与下面的图像对齐。
但是非边缘区域不是透明而是黑色,所以基本上我希望黑色是透明的,或者将黑白色的强度改为透明的强度。
我没有找到用于此转换任务的直接 GPUImage 过滤器。 GPUImageChromaKeyFilter 似乎是这样做的一种方式,但它不仅仅是 RGB 到 Alpha 通道的转换,并且不适用于此任务。
【问题讨论】:
【参考方案1】:编辑: 感谢 Brad 的评论,无需交换通道的更有效解决方案是替换“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 中具有相同的值)来替换阿尔法通道。
【讨论】:
一个更有效的过程可能是创建您自己的 GPUImageSobelEdgeDetectionFilter 子类并提供自定义片段着色器,该着色器还可以调整 alpha 通道以响应边缘强度。对于基本的,您应该只需要复制 Sobel 片段着色器并将gl_FragColor = vec4(vec3(mag), 1.0);
替换为gl_FragColor = vec4(mag);
这将消除第二个颜色调整过滤器的额外内存和处理。不透明混合将负责其余部分。
@BradLarson 刚刚测试并工作。感谢您的评论和您的精彩项目!以上是关于在 GPUImage 中将黑白图像转换为透明和白色图像? RGB -> Alpha 基本上的主要内容,如果未能解决你的问题,请参考以下文章