android - 如何处理色键滤镜中的镜面高光?

标签 android opengl-es shader fragment-shader

我正在使用 opengl 为 android 开发色度键(绿屏)过滤器;唯一的区别是我不仅要替换绿色背景,还要替换用户传递的任何颜色。我已经能够替换颜色,但问题是它也会替换光强度非常高的物体的颜色。

任何人都可以帮助我减少纹理的眩光,以便我的滤镜可以按预期工作吗?

或任何完美运行的引用绿屏滤镜。

任何事情都会受到欢迎。

enter image description here

编辑:我添加了屏幕截图来解释这种情况,在这里我尝试用这些云替换红色背景,它适用于所有区域,除了有眩光的区域。我可以通过增加公差值来克服这个问题,但这样会替换掉对象中的一些黄色像素。

最佳答案

在算法方面,仅匹配 RGB 颜色会很困难。

首先要注意的是,在您的情况下,您实际上只是在查看某种形式的亮度敏感值,而不是纯色度值。明亮的像素在 R、G 和 B channel 中总是有强烈的响应,因此简单的阈值处理不会在这里提供可靠的解决方法。

如果您提取了一个与亮度无关的色度值(就像 YUV 编码所做的那样),那么您可以独立于颜色的亮度来分离“红色”、“绿色”和“蓝色”。

但是,这仍然会有边缘情况。例如,如果您的瓶子是红色的或贴有红色标签会怎样?要解决这个问题,您需要某种形式的几何特征提取(例如图像上的 sorbel 边缘检测),然后仅在特定的识别区域内替换颜色。

这一切都不是微不足道的 - 准确的物体检测和识别非常困难,并且仍在积极研究中(例如,想想 Tesla 巡航控制试图在驾驶时发现和避开物体)。

关于android - 如何处理色键滤镜中的镜面高光?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39865387/

相关文章:

android - 用于 iOS 和 Android 开发的 Corona vs Titanium

Java Android - ImageButton 显示但不允许我单击它

ios - GLSL 着色器错误 "Constructor calls may not have precision"

ios - 记录顶点着色器内变量的值

opengl - 如何使用鼠标改变OpenGL相机

glsl - 如何重复更新单个 Vulkan 渲染 channel 内对象数量的统一数据并使更新同步?

类似于 Facebook 的 Android 搜索

未调用 Android WebView openFileChooser

ios - SceneKit 的 SCNMatrix4 存储为列优先还是行优先?

ios - PVR 纹理是否消耗更少的 RAM?