亮度滤波器opengl中的多彩噪声
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了亮度滤波器opengl中的多彩噪声相关的知识,希望对你有一定的参考价值。
我的最终目标是在我的照片中检测激光线。为此,首先我将RGB颜色空间转换为HSV(以便检查亮度)。然后我将仅选择具有特定值H,S和V的像素(具有特定颜色的最亮像素(在我的情况下为红色))。
满足这些值的像素我为所有3个RGB通道设置了它们的亮度,如果它们不满足,我将它们设置为黑色。
正如我所提到的,我会有一个黑色像素或一个灰色(亮度)像素。我不明白这些紫色或绿色像素是如何进入我的照片的。它们就像噪音一样,不断变化!起初,我认为我有这些颜色,因为值大于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.7
或h <= 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的高斯模板,实现对含高斯噪声的图像进行平滑处理?