Für Luminace Histogramm BerechnungLuminanz-Histogramm Berechnung in GPU-android OpenGL ES 3.0
Ich habe den Code aus dem Projekt GPU Bild ios von Brad Larson verwendet.
Er hat Blending für die Histogrammberechnung verwendet.
Anbringen des Vertex und Fragment-Shader
Vertexshader
#version 300 es
in vec4 position;
out vec3 colorFactor;
const vec3 W = vec3(0.299, 0.587, 0.114);
void main()
{
float luminance = dot(position.xyz, W);
colorFactor = vec3(1.0, 1.0, 1.0);
gl_Position = vec4(-1.0 + (luminance * 0.00784313725), 0.0, 0.0, 1.0);
gl_PointSize = 1.0;
} ;
Fragment-Shader
#version 300 es
const lowp float scalingFactor = 1.0/256.0;
in lowp vec3 colorFactor;
out vec4 gl_FragColor;\n"+
void main()
{
gl_FragColor = vec4(colorFactor * scalingFactor , 1.0);
};
i eine 256x1-Textur mit einem FBO angebracht verwendet und als Eingabe in dem Pixelkarte zur Vertexshader Textur ist wie folgt definiert
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_CLAMP_TO_EDGE);
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_CLAMP_TO_EDGE);
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MIN_FILTER, GLES30.GL_NEAREST);
GLES30.glTexParameterf(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_MAG_FILTER, GLES30.GL_LINEAR);
GLES30.glTexImage2D(GLES30.GL_TEXTURE_2D, 0, GLES30.GL_RGBA,
256, 1, 0, GLES30.GL_RGBA,
GLES30.GL_UNSIGNED_BYTE, null);
Und mein onDrawFrame geht so
GLES30.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);
GLES30.glBlendEquation(GLES30.GL_FUNC_ADD);
GLES30.glBlendFunc(GLES30.GL_ONE, GLES30.GL_ONE);
GLES30.glEnable(GLES30.GL_BLEND);
filterPositionAttribute = mshader2.getHandle("position");
GLES30.glVertexAttribPointer(filterPositionAttribute, 4, GLES30.GL_UNSIGNED_BYTE,false,60, PixelBuffer);
GLES30.glEnableVertexAttribArray(filterPositionAttribute);
GLES30.glDrawArrays(GLES30.GL_POINTS, 0, mViewportWidth * mViewportHeight /16);
i wird mit 1 Pixel von 16 für Histogramm-Berechnung.
Jetzt bekomme ich die Grafik und die Werte. Aber wenn mit Matlab und andere Software wie irfanview verifiziert, scheint es abweichend.
Anbringen des Graphen in Excel erstellt values from my application
wird diese Änderung zu erwarten oder ich einige Fehler mache. Könnte jemand helfen, danke im voraus
übersprungen Wo steht Ihr "60" kommt? Das macht es einmal alle 15 Pixel und nicht alle 16 Pixel. – 246tNt
Außerdem würde ich vorschlagen, 0,5 hinzuzufügen, um sicherzustellen, dass Sie den GL_POINT in der Mitte des Pixels zeichnen. Außerdem sollte die Konstante 1/256.0 und nicht 1/255.0 sein. 'gl_Position = vec4 (-1.0 + (0.5 + Luminanz) * (1.0/256.0), 0.5, 0.0, 1.0);' – 246tNt
@ 246tNt Danke für den Vorschlag, aber auch nach der Verwendung von gl_Position = vec4 (-1.0 + (0.5 + Luminanz) * (1,0/256,0), 0,5, 0,0, 1,0); Ich bekomme Variation im Vergleich mit der Berechnung in Matlab –