Bu konuyla ilgili olarak , GLSL'de Sobel Kenar Algılama filtresini başarıyla uyguladım . Filtrenin parça gölgelendirici kodu:
#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);
}
Ve işte Sobel kenar algılamalı bir küpün sonucu:
Resmi büyütürseniz, Sobel tarafından üretilen çok sayıda "gürültü" olduğunu göreceksiniz: Mavi / beyaz renk geçişi nedeniyle sahnenin her yerinde gri yatay çizgiler var. Dahası, ışık konileri küp üzerinde istenmeyen bir desen üretir. Küpün solundaki siyah kenarlar, küpün sol yarısındaki ışık konisi nedeniyle solmuş gibi görünüyor.
Bu yüzden kişinin önce görüntüyü gri tonlamalı ve kenarları daha belirgin hale getirmek için Gauss bulanıklaştırma filtresi kullanması gerektiğini belirten bu makaleyi okudum . Makalenin alt kısmında, daha iyi sonuçlar verdiği anlaşılan kenar kenarı algılama filtresi de var.
Şimdi iki sorum var:
Mümkün olan en iyi kenar algılama sonuçlarını üretmek için aşağıdaki adımlar doğru mu?
- Gri tonlama
- Gauss Bulanıklığı
- Sobel / Canny kenar algılama
Evetse, orijinal görüntüyü işlenen görüntüyle nasıl birleştiririm? Yani, yukarıda belirtilen adımları işledikten sonra, tamamen beyaz kenarlı siyah bir görüntü veya yardımcı verca alıyorum. Kenarları orijinal görüntüme / dokuma nasıl yerleştiririm?
Yardımın için teşekkürler!