第 11 课:Edge Detection
我的解:卷积核(convolution kernel)是一个小矩阵,通常是 3x3,用于图像滤波。
我的解
uniform vec2 iResolution;
uniform sampler2D iChannel0;
uniform vec2 iChannelSize0;
float applyKernel(mat3 kernel, mat3 region){
float sum = 0.0;
for (int i = 0; i<3;++i)
for (int j = 0; j < 3; ++j)
sum += kernel[j][i] * region[j][i];
return sum;
}
float RelativeLuminance(vec3 color){
return dot(color, vec3(0.2125, 0.7154, 0.0721));
}
void main() {
vec2 texCoord = gl_FragCoord.xy / iResolution.xy;
//像素偏移单位
vec2 texelSize = 1.0 / iChannelSize0;
//采样图像周围的3x3区域亮度
mat3 region;
for (int j = 0; j<3;++j){
for (int i = 0; i<3;++i){
vec2 offset = texelSize * vec2(float(i-1),float(j-1));
region[j][i] = RelativeLuminance(texture(iChannel0, texCoord+offset).rgb);
}
}
mat3 sobelX = mat3(
-1, -2, -1, // column 0
0, 0, 0, // column 1
1, 2, 1 // column 2
);
mat3 sobelY = mat3(
-1, 0, 1,
-2, 0, 2,
-1, 0, 1
);
float gx = applyKernel(sobelX, region);
float gy = applyKernel(sobelY, region);
float M = sqrt(gx*gx + gy*gy);
gl_FragColor = vec4(vec3(1.0)*M, 1.0);
}
复盘笔记
- 卷积核(convolution kernel)是一个小矩阵,通常是 3x3,用于图像滤波。
- 原理:取邻域像素,乘以核中对应权重,再求和作为当前像素的新值。
- 应用:模糊、锐化、边缘检测、浮雕等。
<2025/05/30>- ==记录时间: 5月31日 2025, 02:48 下午==