Per quanto riguarda questo argomento, ho implementato con successo il filtro Rilevamento bordi Sobel in GLSL. Ecco il codice shader frammento del filtro:
#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);
}
Ed ecco il risultato di un cubo con rilevamento dei bordi di Sobel:
Se ingrandisci l'immagine, vedrai che c'è molto "rumore" prodotto da Sobel: ci sono strisce orizzontali grigie su tutta la scena a causa del gradiente blu / bianco. Inoltre, i coni di luce producono uno schema indesiderato sul cubo. Anche i bordi neri a sinistra del cubo sembrano sbiadire a causa del cono di luce nella metà sinistra del cubo.
Quindi ho letto questo articolo in cui si afferma che si dovrebbe prima scala di grigi l'immagine e utilizzare un filtro di sfocatura gaussiana per rendere più evidenti i bordi. Nella parte inferiore dell'articolo, c'è anche il filtro di rilevamento del bordo astuto che sembra produrre risultati migliori.
Ora ho due domande:
I seguenti passaggi sono corretti per produrre i migliori risultati possibili di rilevamento dei bordi:
- Scala di grigi
- Sfocatura gaussiana
- Rilevamento dei bordi di Sobel / Canny
Se sì, come unirei l'immagine originale con l'immagine elaborata? Voglio dire, dopo aver elaborato i passaggi sopra indicati, ottengo un'immagine completamente nera con bordi bianchi o vice verca. Come metterei i bordi sulla mia immagine / trama originale?
Grazie per l'aiuto!