通过比较另一个图像的强度来更改图像的强度 - OpenTK

2024-01-11

我有两个图像。我必须找到第一张图像中强度大于 0.8 的点。同时,我必须找到第二张图像在相同点上的强度,并且需要使用阈值/滑块值(范围从 0 到 1)调整第二张图像在相同点上的光线。我已经做了如下。点上出现黑色或深色区域的强度大于 0.8。 我正在尝试使用 HSV 的 z 值。
但我应该能够调整 image2 上的光线,而不是这个黑色区域。我怎样才能实现这个目标?

public void CreateShaders()
{
    /***********Vert Shader********************/
    vertShader = GL.CreateShader(ShaderType.VertexShader);
    GL.ShaderSource(vertShader, @"
        attribute vec3 a_position;
        varying vec2 vTexCoordIn; 
        void main() {
            vTexCoordIn=( a_position.xy+1)/2 ;
            gl_Position = vec4(a_position,1);
        }");
    GL.CompileShader(vertShader);

    /***********Frag Shader ****************/
    fragShader = GL.CreateShader(ShaderType.FragmentShader);
    GL.ShaderSource(fragShader, @"
        precision highp float;

        uniform sampler2D sTexture1;
        uniform sampler2D sTexture2;  
        varying vec2 vTexCoordIn;
        const float Epsilon = 1e-10;
        uniform float sSelectedIntensity1;//slider value 0 to 1
        void main ()
        {
            vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);    
            vec4  color1 = texture2D (sTexture1, vTexCoord);
            vec4  color2= texture2D (sTexture2, vTexCoord);
            vec3  col1_hsv = RGBtoHSV(color1.rgb);
            float col1_intensity =col1_hsv.z;
            float ConstVal=0.8;

            if(col1_intensity>ConstVal)
            { 
                vec3 col_hsv = RGBtoHSV(color2.rgb);
                col_hsv.z *= sSelectedIntensity1;//slider value 0 to 1 
                vec3 col_rgb = HSVtoRGB(col_hsv.rgb);
                gl_FragColor = vec4(col_rgb.rgb, color2.a);
            }
            else
            {  
                gl_FragColor = color2;
            }
        }");
    GL.CompileShader(fragShader);
}

实际上,如果 image1 和 image2 分别是来自两个调节摄像机 cam1 和 cam2 的帧。如果我在 cam1 前面放一个闪光灯,我应该能够调暗/消除相机 2 帧上的这种灯光效果。


如果要修改颜色的亮度,则必须乘以 [0, 2] 范围内的值,而不是 [0, 1] 范围内的值。如果与 [0, 1] 范围内的值相乘,结果最多将与源一样亮:

col_hsv.z *= sSelectedIntensity1 * 2.0;

如果您想根据其他图像的“明亮”部分来启发图像,那么您必须向亮度添加一个术语,该术语取决于(其他图像的)亮度和滑块。例如。:

col_hsl2.z += (col1_intensity-constVal)*sSelectedIntensity1/(1.0-constVal);

如果您想更改亮度,我建议使用HSL(色调、饱和度、亮度) https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB颜色范围而不是HSV(色调、饱和度、明度 https://en.wikipedia.org/wiki/HSL_and_HSV#HSL_to_RGB.
与 HSV 相比,在 HSL 中,第三个值代表颜色的亮度:

const float Epsilon = 1e-10;

vec3 RGBtoHSL(in vec3 RGB)
{
    vec4  P   = (RGB.g < RGB.b) ? vec4(RGB.bg, -1.0, 2.0/3.0) : vec4(RGB.gb, 0.0, -1.0/3.0);
    vec4  Q   = (RGB.r < P.x) ? vec4(P.xyw, RGB.r) : vec4(RGB.r, P.yzx);
    float C   = Q.x - min(Q.w, Q.y);
    float H   = abs((Q.w - Q.y) / (6.0 * C + Epsilon) + Q.z);
    vec3  HCV = vec3(H, C, Q.x);
    float L   = HCV.z - HCV.y * 0.5;
    float S   = HCV.y / (1.0 - abs(L * 2.0 - 1.0) + Epsilon);
    return vec3(HCV.x, S, L);
}

vec3 HSLtoRGB(in vec3 HSL)
{
    float H   = HSL.x;
    float R   = abs(H * 6.0 - 3.0) - 1.0;
    float G   = 2.0 - abs(H * 6.0 - 2.0);
    float B   = 2.0 - abs(H * 6.0 - 4.0);
    vec3  RGB = clamp( vec3(R,G,B), 0.0, 1.0 );
    float C   = (1.0 - abs(2.0 * HSL.z - 1.0)) * HSL.y;
    return (RGB - 0.5) * C + HSL.z;
}

使用这样的函数:

void main ()
{
    vec2  vTexCoord = vec2(vTexCoordIn.x,vTexCoordIn.y);
    vec4  color1    = texture2D (sTexture1, vTexCoord);
    vec4  color2    = texture2D (sTexture2, vTexCoord);

    vec3  col1_hsl1 = RGBtoHSL(color1.rgb);
    float col1_intensity = col1_hsl1.z;

    float constVal = 0.8;
    if (col1_intensity > constVal)
    {
        vec3 col_hsl2 = RGBtoHSL(color2.rgb);
        col_hsl2.z   += (col1_intensity-constVal)*sSelectedIntensity1/(1.0-constVal);
        vec3 col_rgb  = HSLtoRGB(col_hsl2.rgb);
        color2        = vec4(col_rgb.rgb, color2.a);
    }

    gl_FragColor = color2;
}

另一种选择是根据另一个图像的亮度来修改整个图像的亮度。在这种情况下,不需要系数 0.8:

void main ()
{
    vec2  vTexCoord = vec2(vTexCoordIn.x,vTexCoordIn.y);
    vec4  color1    = texture2D (sTexture1, vTexCoord);
    vec4  color2    = texture2D (sTexture2, vTexCoord);

    vec3  col1_hsl1 = RGBtoHSL(color1.rgb);
    float col1_intensity = col1_hsl1.z;

    vec3 col_hsl2  = RGBtoHSL(color2.rgb);
    col_hsl2.z    += col1_intensity * sSelectedIntensity1;
    vec3 col_rgb2  = HSLtoRGB(col_hsl2.rgb);
    color2         = vec4(col_rgb2.rgb, color2.a);

    gl_FragColor = color2;
}

另一个不错的效果可以通过照亮强度高于 0.8 的区域并使光线低于 0.8 的区域变暗来实现:

void main ()
{
    vec2  vTexCoord = vec2(vTexCoordIn.x,vTexCoordIn.y);
    vec4  color1    = texture2D (sTexture1, vTexCoord);
    vec4  color2    = texture2D (sTexture2, vTexCoord);

    vec3  col1_hsl1 = RGBtoHSL(color1.rgb);
    float col1_intensity = col1_hsl1.z;

    vec3 col_hsl2  = RGBtoHSL(color2.rgb);

    float constVal = 0.8;
    if (col1_intensity > constVal)
        col_hsl2.z += (col1_intensity-constVal)*sSelectedIntensity1/(1.0-constVal);
    else
        col_hsl2.z += (col1_intensity-constVal)*sSelectedIntensity1/constVal;

    vec3 col_rgb2  = HSLtoRGB(col_hsl2.rgb);
    color2         = vec4(col_rgb2.rgb, color2.a);

    gl_FragColor = color2;
}

有很多可能性,您必须选择最适合您需求的功能。


如果你想“调暗”图像,那么你必须根据“逆”因子或其他图像的亮度来操纵每个像素的亮度(* (1.0 - col1_hsl1.z)) 如果滑块低于 0.5:

void main ()
{
    vec2  vTexCoord = vec2(vTexCoordIn.x,vTexCoordIn.y);
    vec4  color1    = texture2D (sTexture1, vTexCoord);
    vec4  color2    = texture2D (sTexture2, vTexCoord);

    vec3  col1_hsl1 = RGBtoHSL(color1.rgb);
    float col1_intensity = col1_hsl1.z;

    vec3 col_hsl2  = RGBtoHSL(color2.rgb);

    if (sSelectedIntensity1 < 0.5)
        col_hsl2.z *= (1.0 - col1_intensity * (1.0-2.0*sSelectedIntensity1));
    else
        col_hsl2.z += col1_intensity * (2.0*sSelectedIntensity1-1.0);

    vec3 col_rgb2  = HSLtoRGB(col_hsl2.rgb);
    color2         = vec4(col_rgb2.rgb, color2.a);

    gl_FragColor = color2;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过比较另一个图像的强度来更改图像的强度 - OpenTK 的相关文章

随机推荐

  • 自连接查询

    是否可以仅使用 join 进行父子查询而不循环遍历临时表 数据库样本 menuid name parent url A0000 Master A0000 A0001 Rekening A0000 master rekening aspx A
  • 如何解决“多重性在角色中无效”错误?

    我有以下模型 public class Retailer Entity public string Name get set public string Address get set public virtual ICollection
  • 为什么在Windows下搭建Android 2.3的开发环境如此噩梦般? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 使用 vanilla JS 和循环绘制表格

    我正在做一个练习 来自 Beginning Javascript 以更好地理解 DOM 操作 尝试仅使用 JS 以 DRY 方法重新创建下表 教科书解决方案是here https jsfiddle net robert93 99mph1jq
  • ASP.NET MVC 支持 HTML 输出(而不是 XHTML)

    在我看来 ASP NET MVC Html Helpers 只输出类似 XHTML 的标签 封闭的空元素 这不是有效的 HTML ASP NET MVC 是否支持 HTML 输出 正如 pcampbell 暗示的那样 您可能需要编写自己的
  • 如何衡量计算着色器的时间性能?

    我需要测量计算着色器的时间 但这当然不是小事 从OpenGL 维基 性能 https www opengl org wiki Performance我知道 在着色器调用之前和之后使用 glFinish 很有用 但他们也说使用它并不是那么好
  • 模拟器和合成器之间初始化状态机的差异

    我的问题是关于合成状态机中使用的第一个状态 我正在使用莱迪思 iCE40 FPGA 用于仿真的 EDA Playground 和用于综合的莱迪思 Diamond Programmer 在下面的示例中 我生成一系列信号 该示例仅显示引用状态机
  • Chart.js:从canvas获取图表数据

    我有几个 Chart js 图表 以后可能需要更新 当我需要更新图表时 是否可以从canvas元素中提取myChart对象 或者我是否必须在全局范围内保存每个 myChart 对象 for var i 1 i lt 5 i createCh
  • PyMC3 将随机协方差矩阵传递给 pm.MvNormal()

    我尝试使用 PyMC3 将简单的 2D 高斯模型拟合到观察到的数据 import numpy as np import pymc3 as pm n 10000 np random seed 0 X np random multivariat
  • 为什么Java认为从10到99所有数字的乘积都是0?

    以下代码块的输出为 0 public class HelloWorld public static void main String args int product 1 for int i 10 i lt 99 i product i S
  • AS3 Blitting - 复制像素获取一些源图像

    我试图在屏幕上绘制一些内容 然后将其复制到舞台上的位图上 我以前已经这样做过 用程序绘制的形状如圆形 但当我使用库项目时 大多数源像素都会被切断 这是我的代码 在另一个函数中 位图对象被添加到舞台上 我可以看到 copyPixels 工作
  • TFS Git - 拉取请求“合并失败”

    您好 我在 TFS 和 git pull requests 方面遇到了这个问题 我们有两个主要分支 掌握 发展 所以我创建新分支 async data loadingdevelop并对其进行一些更改 接下来 我提交更改并将其推送到远程 as
  • 当div高度未设置时,如何让html表格高度=父div的高度

    我有一个 html 表 位于 div 内 div 的高度基于 div 中的其他元素 如何让表格的高度等于其父 div 的高度 表格高度 100 不起作用 因为未设置div的高度 Update 我需要支持 IE6 7 8 因此这些浏览器应该能
  • ios core data如何实现sql事务功能?

    就像标题一样 我使用核心数据来插入项目 我插入了100个项目 它太慢了 如何提高插入速度 Core Data有哪些交易功能 lt NSManagedObjectContext gt undoManager beginUndoGrouping
  • 如何在 Django 模板中使用域 get_absolute_url ?

    所以我有点挣扎 一些逻辑上看起来很简单的东西 但由于我对 Django 的理解有限 我不确定在哪里寻找以及如何制定解决方案 基本上我设置了一个博客应用程序 它在主页上显示完整的 所有内容 包括 disqus 讨论 最新帖子 该帖子还有一个指
  • 检测objective-c中for()循环的真正结束

    我将在我的应用程序中显示一种 UIActivityIndi catorView 同时在 for 循环内解析多个 JSON 对象 我不知道必须在哪里放置 UIActivityIndi catorView startAnimating 和 UI
  • keyof T 的默认类型不能用于索引类型 T

    我正在尝试重构此代码以使用静态方法 因为该类仅用于命名空间和Query equal
  • 检查包含任意顺序的 3 个连续字母和 2 个数字的字符串

    我似乎无法理解这个问题 我想我应该在这里寻求一些帮助 基本上我正在验证密码字段 要求如下 必须包含3个连续字母 必须包含至少 2 位数字 可以是任何顺序 例如 1abc342 abc24g3 11abcsjf 这是我到目前为止所拥有的 但我
  • WebSphere MQ 确认和回复队列

    我们通过远程队列定义 CLIENT DATA 传输队列 发送 接收通道等 从队列管理器 QM MINE 队列管理器 QM CLIENT 和队列 CLIENT DATA 发送 XML 文本消息 消息到达目的地 客户端的 CLIENT DATA
  • 通过比较另一个图像的强度来更改图像的强度 - OpenTK

    我有两个图像 我必须找到第一张图像中强度大于 0 8 的点 同时 我必须找到第二张图像在相同点上的强度 并且需要使用阈值 滑块值 范围从 0 到 1 调整第二张图像在相同点上的光线 我已经做了如下 点上出现黑色或深色区域的强度大于 0 8