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

C# 通过比较另一个图像的强度来更改图像的强度-OpenTK,c#,image-processing,glsl,fragment-shader,opentk,C#,Image Processing,Glsl,Fragment Shader,Opentk,我有两张图像,我必须找到第一张图像中强度大于0.8的点。同时,我必须找到相同点上第二个图像的强度,并需要使用阈值/滑块值(范围从0到1)调整相同点上第二个图像上的灯光。在点上获得黑色或黑色区域的强度大于0.8 我正在尝试HSV的z值。 但是我应该能够调整图像2上的灯光,而不是这个黑色区域。我怎样才能做到这一点 public void CreateShaders() { /***********Vert Shader********************/ vertShader

我有两张图像,我必须找到第一张图像中强度大于0.8的点。同时,我必须找到相同点上第二个图像的强度,并需要使用阈值/滑块值(范围从0到1)调整相同点上第二个图像上的灯光。在点上获得黑色或黑色区域的强度大于0.8 我正在尝试HSV的z值。
但是我应该能够调整图像2上的灯光,而不是这个黑色区域。我怎样才能做到这一点

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*=s选择的张力1*2.0;
如果你想照亮依赖于其他图像“明亮”部分的图像,那么你必须为亮度添加一个术语,这取决于(其他图像)的亮度和滑块。e、 g:

col_hsl2.z+=(col1_强度-constVal)*选择强度1/(1.0-constVal);
如果要更改亮度,我建议使用颜色范围而不是颜色范围。
与HSV相比,在HSL处,第三个值表示颜色的亮度:

const float Epsilon=1e-10;
vec3 RGBtoHSL(在vec3 RGB中)
{
vec4p=(RGB.g
使用如下功能:

void main()
{
vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);
vec4 color1=纹理2D(结构1,vTexCoord);
vec4 color2=纹理2D(纹理2,vTexCoord);
vec3 col1_hsl1=RGBtoHSL(color1.rgb);
浮动col1_强度=col1_hsl1.z;
浮点数=0.8;
如果(col1_强度>常数)
{
vec3 col_hsl2=RGBtoHSL(color2.rgb);
col_hsl2.z+=(col1_强度-constVal)*选择的强度1/(1.0-constVal);
vec3 col_rgb=HSLtoRGB(col_hsl2.rgb);
color2=vec4(col_rgb.rgb,color2.a);
}
gl_FragColor=颜色2;
}

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

void main()
{
vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);
vec4 color1=纹理2D(结构1,vTexCoord);
vec4 color2=纹理2D(纹理2,vTexCoord);
vec3 col1_hsl1=RGBtoHSL(color1.rgb);
浮动col1_强度=col1_hsl1.z;
vec3 col_hsl2=RGBtoHSL(color2.rgb);
col_hsl2.z+=col1_强度*选择的强度1;
vec3 col_rgb2=HSLtoRGB(col_hsl2.rgb);
color2=vec4(col_rgb2.rgb,color2.a);
gl_FragColor=颜色2;
}
通过照亮强度高于0.8的区域并使光线低于0.8的区域变暗,可以实现另一个很好的效果:

void main()
{
vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);
vec4 color1=纹理2D(结构1,vTexCoord);
vec4 color2=纹理2D(纹理2,vTexCoord);
vec3 col1_hsl1=RGBtoHSL(color1.rgb);
浮动col1_强度=col1_hsl1.z;
vec3 col_hsl2=RGBtoHSL(color2.rgb);
浮点数=0.8;
如果(col1_强度>常数)
col_hsl2.z+=(col1_强度-constVal)*选择的强度1/(1.0-constVal);
其他的
col_hsl2.z+=(col1_强度-constVal)*选择强度1/constVal;
vec3 col_rgb2=HSLtoRGB(col_hsl2.rgb);
color2=vec4(col_rgb2.rgb,color2.a);
gl_FragColor=颜色2;
}
有很多可能性,你必须根据你的需要选择最好的功能


如果要“调暗”图像,则必须根据“反转”因子或其他图像的亮度(如果滑块低于0.5,则为1.0-col1\u hsl1.z)
)来操纵每个像素的亮度:

void main()
{
vec2 vTexCoord=vec2(vTexCoordIn.x,vTexCoordIn.y);
vec4 color1=纹理2D(结构1,vTexCoord);
vec4 color2=纹理2D(纹理2,vTexCoord);
vec3 col1_hsl1=RGBtoHSL(color1.rgb);
浮动col1_强度=col1_hsl1.z;
vec3 col_hsl2=RGBtoHSL(color2.rgb);
如果(选择的强度1<0.5)
col_hsl2.z*=(1.0-col1_强度*(1.0-2.0*选择强度1));
其他的
col_hsl2.z+=col1_强度*(2.0*选择强度1-1.0);
vec3 col_rgb2=HSLtoRGB(col_hsl2.rgb);
color2=vec4(col_rgb2.rgb,color2.a);
gl_FragColor=颜色2;
}

尝试使用HSL。你能检查一下附件中的图片吗。滑块上的0.5表示精确图像。此外,照明在所有滑块值上都可以正常工作。但为什么改变滑块值时,黑色区域会环绕在它周围呢there@H.NS当然是黑色的。如果亮度为零,则碎片变为黑色。可能你想要一些不同的东西,比如
col\hsl2.z+