亮度滤波器opengl中的多彩噪声

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了亮度滤波器opengl中的多彩噪声相关的知识,希望对你有一定的参考价值。

我的最终目标是在我的照片中检测激光线。为此,首先我将RGB颜色空间转换为HSV(以便检查亮度)。然后我将仅选择具有特定值H,S和V的像素(具有特定颜色的最亮像素(在我的情况下为红色))。

满足这些值的像素我为所有3个RGB通道设置了它们的亮度,如果它们不满足,我将它们设置为黑色。

这是我的问题和疑问:enter image description here

enter image description here

enter image description here

正如我所提到的,我会有一个黑色像素或一个灰色(亮度)像素。我不明白这些紫色或绿色像素是如何进入我的照片的。它们就像噪音一样,不断变化!起初,我认为我有这些颜色,因为值大于1.但我认为OpenGL将值限制为0-1(我甚至自己尝试过但没有成功)。

谁知道是什么原因导致这种影响任何帮助或想法表示赞赏。

这是我的片段着色器:

precision highp float;

varying vec2 textureCoordinate;

uniform sampler2D inputImageTexture;


const highp vec3 W = vec3(0.299, 0.587, 0.114);


void main()
{
 lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);

 float luminance = dot(textureColor.rgb, W);

 float r = textureColor.r;
 float g = textureColor.g;
 float b = textureColor.b;
 float h;
 float s;
 float v;

 float min = 0.0;
 float max = 0.0;
 float delta = 0.0;

 if(r >= g) {
     if(r >= b) {
         max = r;
     }
     else {
         max = b;
     }
 }
 else {
     if(g >= b) {
         max = g;
     }
     else {
         max = b;
     }
 }

 // max = MAX( r, g, b );
 if(r < g) {
     if(r < b) {
         min = r;
     }
     else {
         min = b;
     }
 }
 else {
     if(g < b) {
         min = g;
     }
     else {
         min = b;
     }
 }


 v = max;                // v
 delta = max - min;

 if (delta == 0.0) {
     h = 0.0;
     s = 0.0;
     return;
 }
 else if( max != 0.0 )
     s = delta / max;        // s
 else {
     // r = g = b = 0        // s = 0, v is undefined
     s = 0.0;
     h = -1.0;
     return;
 }
 if( r == max ){
     h = ( g - b ) / delta;         // between yellow & magenta

     h = mod(h, 6.0);
 }
 else if( g == max )
     h = 2.0 + ( b - r ) / delta;    // between cyan & yellow
 else
     h = 4.0 + ( r - g ) / delta;    // between magenta & cyan


 h = h * 60.0;                // degrees

 if( h < 0.0 )
     h = h + 360.0;
 //HSV transformation ends here
 if(v >0.8){
     if(s > 0.7){
         if( h >320.0  && h < 360.0){

             if(luminance  > 1.0)
                 gl_FragColor = vec4(vec3(1.0), textureColor.a);
             else
                 gl_FragColor = vec4(vec3(luminance ), textureColor.a);
         }

     }
 }else{
     gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
 }
}

我不得不提一下,大白点是阳光,而且它非常明亮,最终会通过我的HSV条件。这不是我现在的问题,但这些紫色噪声就像是像素那样或图片周围的绿色噪音是我的问题。

答案

紫色和绿色像素可能是未初始化的内存。

gl_FragColor不保证在着色器的开头初始化,因此在第70行和第78行的return语句之前初始化它应该可以解决问题。

如果没有,并且使用了未初始化的帧缓冲,那么可能是因为一个不同的(并且不那么相似)原因:

  • 可能是因为混合。尝试禁用它或确保gl_FragColor.a为1。
  • 这可能是因为模板缓冲区正在暴露它。尝试禁用模板测试或确保所有像素都通过模板测试。

或者,如果它是由模板测试的混合引起的,则可以使用类似glClear()的方式初始化帧缓冲区。

另一答案

虽然你的片段“返回”而没有设置片段颜色,如下所示:

 else {
     // r = g = b = 0        // s = 0, v is undefined
     s = 0.0;
     h = -1.0;
     return; //<<<<==== NO gl_FragColor set

我认为这段代码缺少s <= 0.7h <= 320.0案例的else路径:

if(v >0.8){
     if(s > 0.7){
         if( h >320.0  && h < 360.0){

             if(luminance  > 1.0)
                 gl_FragColor = vec4(vec3(1.0), textureColor.a);
             else
                 gl_FragColor = vec4(vec3(luminance ), textureColor.a);
         }
         //<<<<===== NO 'else' for h<320
     }
     ///<<<<====== NO 'else' for s<0.7
 }else{
     gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
 }

因此,在许多情况下片段(图像上的当前像素)保持不变。

另一答案

所以我的错误是我返回的一些地方,但没有设置gl_FragColor。在我的情况下,任何进程失败或不符合我必须设置的条件:

gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);

更正的代码应如下所示:

precision highp float;

varying vec2 textureCoordinate;

uniform sampler2D inputImageTexture;

const highp vec3 W = vec3(0.299, 0.587, 0.114);

void main()
{
 lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
 float luminance = dot(textureColor.rgb, W);

 //RF: test
 float r = textureColor.r;
 float g = textureColor.g;
 float b = textureColor.b;
 float h;
 float s;
 float v;

 float min = 0.0;
 float max = 0.0;
 float delta = 0.0;

 // min = MIN( r, g, b );
 if(r >= g) {
     if(r >= b) {
         max = r;
     }
     else {
         max = b;
     }
 }
 else {
     if(g >= b) {
         max = g;
     }
     else {
         max = b;
     }
 }

 if(r < g) {
     if(r < b) {
         min = r;
     }
     else {
         min = b;
     }
 }
 else {
     if(g < b) {
         min = g;
     }
     else {
         min = b;
     }
 }


 v = max;                // v
 delta = max - min;

 if (delta == 0.0) {
     h = 0.0;
     s = 0.0;
     gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
     return;
 }
 else if( max != 0.0 )
     s = delta / max;        // s
 else {
     s = 0.0;
     h = -1.0;
     gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
     return;
 }
 if( r == max ){
     h = ( g - b ) / delta;         // between yellow & magenta

     h = mod(h, 6.0);
 }
 else if( g == max )
     h = 2.0 + ( b - r ) / delta;    // between cyan & yellow
 else
     h = 4.0 + ( r - g ) / delta;    // between magenta & cyan
 h = h * 60.0;                // degrees
 if( h < 0.0 )
     h = h + 360.0;
 //---------------------------------------------------

 if(v >0.8){
     if(s > 0.2){
         if( h >320.0  && h < 360.0){
             gl_FragColor = vec4(vec3(luminance ), textureColor.a);
             return;
         }
     }
 }
 gl_FragColor = vec4(0.0, 0.0, 0.0, 1.0);
}

然后它很棒:Resulting Image

以上是关于亮度滤波器opengl中的多彩噪声的主要内容,如果未能解决你的问题,请参考以下文章

Python图像平滑滤波处理(均值滤波方框滤波高斯滤波中值滤波双边滤波)

给图像添加椒盐噪声后用均值滤波和中值滤波过滤椒盐噪声的C++-OpenCV代码

滤波时根据高斯函数的形状来选择权值。采用3×3,5×5的高斯模板,实现对含高斯噪声的图像进行平滑处理?

一维粒子滤波纯代码

现有一含有椒盐噪声的图像image.jpg如何增强该图像,写出matlab程序

代码片段如何使用CSS来快速定义多彩光标