En ce qui concerne ce sujet, j'ai réussi à implémenter le filtre de détection des bords Sobel dans GLSL. Voici le fragment shader code du filtre:
#version 330 core
in vec2 TexCoords;
out vec4 color;
uniform sampler2D screenTexture;
mat3 sx = mat3(
1.0, 2.0, 1.0,
0.0, 0.0, 0.0,
-1.0, -2.0, -1.0
);
mat3 sy = mat3(
1.0, 0.0, -1.0,
2.0, 0.0, -2.0,
1.0, 0.0, -1.0
);
void main()
{
vec3 diffuse = texture(screenTexture, TexCoords.st).rgb;
mat3 I;
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
vec3 sample = texelFetch(screenTexture, ivec2(gl_FragCoord) + ivec2(i-1,j-1), 0 ).rgb;
I[i][j] = length(sample);
}
}
float gx = dot(sx[0], I[0]) + dot(sx[1], I[1]) + dot(sx[2], I[2]);
float gy = dot(sy[0], I[0]) + dot(sy[1], I[1]) + dot(sy[2], I[2]);
float g = sqrt(pow(gx, 2.0)+pow(gy, 2.0));
color = vec4(diffuse - vec3(g), 1.0);
}
Et voici le résultat d'un cube avec détection de bords Sobel:
Si vous agrandissez l'image, vous verrez qu'il y a beaucoup de "bruit" produit par Sobel: Il y a des rayures horizontales grises sur toute la scène en raison du dégradé bleu / blanc. De plus, les cônes lumineux produisent un motif indésirable sur le cube. Les bords noirs à gauche du cube semblent également s'estomper à cause du cône de lumière sur la moitié gauche du cube.
J'ai donc lu cet article qui disait qu'il fallait d'abord mettre l'image en niveaux de gris et utiliser un filtre de flou gaussien pour rendre les bords plus apparents. Au bas de l'article, il y a aussi le filtre de détection de bord rusé qui semble produire de meilleurs résultats.
Maintenant, j'ai deux questions:
Les étapes suivantes sont-elles correctes pour produire les meilleurs résultats de détection de bord possibles:
- Niveaux de gris
- Flou gaussien
- Détection des bords Sobel / Canny
Si oui, comment fusionnerais-je l'image originale avec l'image traitée? Je veux dire, après avoir traité les étapes décrites ci-dessus, j'obtiens une image qui est soit complètement noire avec des bords blancs, soit vice-versa. Comment placer les bords sur mon image / texture d'origine?
Merci de votre aide!