跳到主要内容
← Image Manipulation with Shaders

Image Manipulation with Shaders

Edge Detection

卷积核(convolution kernel)是一个小矩阵,通常是 3x3,用于图像滤波。

实时渲染 · 纹理 GLSL

第 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 下午==