Đối với chủ đề này, tôi đã triển khai thành công bộ lọc Phát hiện cạnh Sobel trong GLSL. Đây là mã shader mảnh của bộ lọc:
#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);
}
Và đây là kết quả của một khối lập phương với phát hiện cạnh Sobel:
Nếu bạn phóng to hình ảnh, bạn sẽ thấy có rất nhiều "nhiễu" do Sobel tạo ra: Có các sọc ngang màu xám trên toàn cảnh do độ dốc màu xanh / trắng. Hơn nữa, các nón ánh sáng tạo ra một mô hình không mong muốn trên khối lập phương. Các cạnh màu đen bên trái của khối lập phương dường như cũng mờ dần vì hình nón nhẹ ở nửa bên trái của khối lập phương.
Vì vậy, tôi đã đọc bài viết này trong đó tuyên bố rằng người ta nên tô màu cho hình ảnh trước và sử dụng bộ lọc mờ Gaussian để làm cho các cạnh rõ ràng hơn. Ở dưới cùng của bài viết, cũng có bộ lọc phát hiện cạnh canny dường như tạo ra kết quả tốt hơn.
Bây giờ tôi có hai câu hỏi:
Các bước sau đây có đúng không để tạo ra kết quả phát hiện cạnh tốt nhất có thể:
- Thang độ xám
- Gaussian Blur
- Phát hiện cạnh Sobel / Canny
Nếu có, làm cách nào để hợp nhất ảnh gốc với ảnh đã xử lý? Ý tôi là, sau khi xử lý các bước đã nêu ở trên, tôi nhận được một hình ảnh hoàn toàn màu đen với các cạnh trắng hoặc ngược lại. Làm thế nào tôi có thể đặt các cạnh trên hình ảnh / kết cấu ban đầu của tôi?
Cảm ơn bạn đã giúp đỡ!