이 주제 와 관련하여 GLSL에서 Sobel Edge Detection 필터를 성공적으로 구현했습니다 . 필터의 조각 쉐이더 코드는 다음과 같습니다.
#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);
}
그리고 다음은 Sobel 모서리 감지 기능이있는 큐브의 결과입니다.
그림을 확대하면 Sobel에서 생성 한 "노이즈"가 많다는 것을 알 수 있습니다. 파란색 / 흰색 그라디언트로 인해 장면 전체에 회색 가로 줄무늬가 있습니다. 또한, 라이트 콘은 큐브에서 원치 않는 패턴을 생성합니다. 큐브 왼쪽의 검은 색 가장자리도 큐브 왼쪽의 밝은 원뿔로 인해 희미 해집니다.
따라서이 기사 를 읽고 이미지를 먼저 그레이 스케일하고 가우시안 블러 필터를 사용하여 가장자리를보다 분명하게 만들어야한다고 언급했습니다. 기사의 맨 아래에는 더 나은 결과를 생성하는 것처럼 보이는 가장자리 감지 필터도 있습니다.
이제 두 가지 질문이 있습니다.
최상의 가장자리 감지 결과를 얻을 수 있도록 다음 단계가 정확합니까?
- 그레이 스케일
- 가우스 흐림
- 소벨 / 캐니 에지 감지
그렇다면 원본 이미지를 처리 된 이미지와 어떻게 병합합니까? 즉, 위에서 언급 한 단계를 처리 한 후 흰색 가장자리가 완전히 검은 색이거나 그 반대의 이미지가 나타납니다. 원본 이미지 / 텍스처에 가장자리를 어떻게 배치합니까?
당신의 도움을 주셔서 감사합니다!