C++ 亮度滤波器opengl中的彩色噪声
我的最终目标是检测照片中的激光线。为此,首先我将RGB颜色空间转换为HSV(以检查亮度)。然后,我将仅选择具有特定H、S和V值的像素(具有特定颜色的最亮像素(在我的示例中为红色)) 满足这些值的像素我为RGB的所有3个通道设置它们的亮度,如果它们不满足,我将它们设置为黑色 我的问题来了: 正如我提到的,我会有一个黑色像素或灰色(亮度)像素。我不明白这些紫色或绿色像素是怎么进入我的图片的。它们就像噪音一样,不断变化! 起初,我认为我有这些颜色是因为值大于1。但我认为OpenGL将值限制为0-1(我自己也尝试过,但没有成功) 有人知道是什么导致了这种效果吗? 任何帮助或想法都将不胜感激 这是我的片段着色器:C++ 亮度滤波器opengl中的彩色噪声,c++,opengl,image-processing,filter,C++,Opengl,Image Processing,Filter,我的最终目标是检测照片中的激光线。为此,首先我将RGB颜色空间转换为HSV(以检查亮度)。然后,我将仅选择具有特定H、S和V值的像素(具有特定颜色的最亮像素(在我的示例中为红色)) 满足这些值的像素我为RGB的所有3个通道设置它们的亮度,如果它们不满足,我将它们设置为黑色 我的问题来了: 正如我提到的,我会有一个黑色像素或灰色(亮度)像素。我不明白这些紫色或绿色像素是怎么进入我的图片的。它们就像噪音一样,不断变化! 起初,我认为我有这些颜色是因为值大于1。但我认为OpenGL将值限制为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);
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);
}
}
高精度浮点;
可变矢量2纹理坐标;
均匀的二维纹理;
常量高p vec3 W=vec3(0.299,0.587,0.114);
void main()
{
lowp vec4 textureColor=texture2D(输入图像纹理,纹理坐标);
浮动亮度=点(textureColor.rgb,W);
浮动r=纹理颜色.r;
float g=textureColor.g;
浮动b=纹理颜色.b;
浮动h;
浮子;
浮动v;
浮动最小值=0.0;
浮动最大值=0.0;
浮动增量=0.0;
如果(r>=g){
如果(r>=b){
max=r;
}
否则{
max=b;
}
}
否则{
如果(g>=b){
最大值=g;
}
否则{
max=b;
}
}
//max=max(r,g,b);
if(r0.8){
如果(s>0.7){
如果(h>320.0&&h<360.0){
如果(亮度>1.0)
gl_FragColor=vec4(vec3(1.0),textureColor.a);
其他的
gl_FragColor=vec4(vec3(亮度),纹理颜色.a);
}
}
}否则{
gl_FragColor=vec4(0.0,0.0,0.0,1.0);
}
}
我必须提到的是,大白点是阳光,它是如此明亮,它通过我的HSV条件在最后。这不是我现在的问题,但是这些紫色的噪声像像素一样存在,或者图片周围的绿色噪声是我的问题 紫色和绿色像素可能是未初始化的内存 gl_FragColor不能保证在着色器开始时初始化,因此在第70行和第78行的返回语句之前初始化它应该可以解决这个问题 如果没有,并且使用了未初始化的帧缓冲区,则可能是因为另一个原因(可能性较小):
- 这可能是因为混合。尝试禁用它或确保gl_FragColor.a为1
- 这可能是因为模具缓冲区正在将其公开。尝试禁用模具测试或确保所有像素都通过模具测试
else {
// r = g = b = 0 // s = 0, v is undefined
s = 0.0;
h = -1.0;
return; //<<<<==== NO gl_FragColor set
else{
//r=g=b=0//s=0,v未定义
s=0.0;
h=-1.0;
return;//因此我的错误是我返回了一些地方,但没有设置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);
}
高精度浮点;
可变矢量2纹理坐标;
均匀的二维纹理;
常量高p vec3 W=vec3(0.299,0.587,0.114);
void main()
{
lowp vec4 textureColor=texture2D(输入图像纹理,纹理坐标);
浮动亮度=点(textureColor.rgb,W);
//射频:测试
浮动r=纹理颜色.r;
float g=textureColor.g;
浮动b=纹理颜色.b;
浮动h;
浮子;
浮动v;
浮动最小值=0.0;
浮动最大值=0.0;
浮动增量=0.0;
//min=min(r,g,b);
如果(r>=g){
如果(r>=b){
max=r;
}
否则{
max=b;
}
}
否则{
如果(g>=b){
最大值=g;
}
否则{
max=b;
}
}
if(r0.8){
如果(s>0.2){
如果(h>320.0&&h<360.0){
gl_FragColor=vec4(vec3(亮度),纹理颜色.a);
返回;
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);
}