このトピックに関しては、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によって生成された多くの「ノイズ」があることがわかります。青/白のグラデーションのため、シーン全体に灰色の横縞があります。さらに、ライトコーンはキューブに不要なパターンを生成します。立方体の左半分にある光の円錐のため、立方体の左側の黒い縁も消えていくように見えます。
そこで、まず画像をグレースケールにし、エッジをよりはっきりさせるためにガウスぼかしフィルターを使用する必要があると述べたこの記事を読みました。記事の下部には、より良い結果をもたらすと思われるキャニーエッジ検出フィルターもあります。
今私は2つの質問があります:
次の手順は、最良のエッジ検出結果を生成するために正しいですか?
- グレースケール
- ガウスぼかし
- Sobel / Cannyエッジ検出
はいの場合、元の画像と処理された画像をどのようにマージしますか?つまり、上記の手順を実行した後、完全に黒いエッジと白いエッジまたはその逆のイメージを取得します。元の画像/テクスチャにエッジをどのように配置しますか?
ご協力いただきありがとうございます!