在 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 基本上的主要内容,如果未能解决你的问题,请参考以下文章

如何在c#中将位图图像转换为黑白? [复制]

在 OpenCV python 中将白色像素转换为黑色

转换后的WPF像素化黑白图像

UITabBarItem 图像颜色为灰色,而原始图像为白色

IOS OpenGL ES GPUImage 图像黑白色调模糊/暗色提亮 GPUImageClosingFilter

从黑白位图图像中提取路径信息