ในส่วนที่เกี่ยวกับหัวข้อนี้ฉันได้ใช้ตัวกรองการตรวจจับขอบ Sobelใน GLSL เรียบร้อยแล้ว นี่คือรหัสส่วนของตัวกรอง:
#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);
}
และนี่คือผลลัพธ์ของ cube ที่มีการตรวจจับขอบ Sobel:
หากคุณขยายภาพคุณจะเห็นว่ามี "เสียง" จำนวนมากที่ผลิตโดย Sobel: มีแถบแนวนอนสีเทาทั่วฉากเนื่องจากการไล่ระดับสีฟ้า / ขาว ยิ่งไปกว่านั้นกรวยแสงสร้างรูปแบบที่ไม่พึงประสงค์บนก้อน ขอบสีดำทางด้านซ้ายของลูกบาศก์ดูเหมือนจะจางหายไปเพราะกรวยแสงที่ครึ่งซ้ายของลูกบาศก์
ดังนั้นฉันจึงอ่านบทความนี้ซึ่งระบุว่าควรมีภาพระดับสีเทาก่อนและใช้ตัวกรองเบลอ Gaussian เพื่อทำให้ขอบชัดเจนยิ่งขึ้น ที่ด้านล่างของบทความนอกจากนี้ยังมีตัวกรองการตรวจจับขอบแสนรู้ซึ่งดูเหมือนจะให้ผลลัพธ์ที่ดีกว่า
ตอนนี้ฉันมีสองคำถาม:
ขั้นตอนต่อไปนี้ถูกต้องเพื่อให้ได้ผลลัพธ์การตรวจจับขอบที่ดีที่สุด:
- โทนสีเทา
- เกาส์เบลอ
- การตรวจจับขอบ Sobel / Canny
ถ้าใช่ฉันจะรวมรูปภาพต้นฉบับกับรูปภาพที่ประมวลผลได้อย่างไร ฉันหมายถึงหลังจากดำเนินการตามขั้นตอนข้างต้นแล้วฉันจะได้ภาพที่มีสีดำสนิทขอบสีขาวหรือ verca ฉันจะวางขอบบนรูปภาพ / พื้นผิวต้นฉบับของฉันได้อย่างไร
ขอบคุณสำหรับความช่วยเหลือของคุณ!