feConvolveMatrix 是 SVG 滤镜中最硬核、数学味最浓的一个. 它允许你通过定义一个 N x N 的卷积矩阵(Kernel), 对图像中的每一个像素及其周围的邻域像素进行加权求和运算.
这个听起来很复杂的数学过程, 实际上是 Photoshop 中许多经典滤镜的底层原理, 包括:模糊、锐化、浮雕、边缘检测等.
核心原理:
对于图像中的每个像素, 滤镜会将它周围的像素值乘以矩阵中对应的数值, 然后将结果相加, 作为该像素的新颜色值.
关键参数:
order: 矩阵的大小, 通常是 3 (3x3) 或 5 (5x5).kernelMatrix: 以空格或逗号分隔的数值列表, 定义了矩阵的具体权重. 这是灵魂所在.divisor: 除数. 通常设为矩阵所有数值之和, 用于归一化颜色, 防止画面变得太亮或太暗.bias: 偏移量. 在计算结果的基础上加上一个值. 常用于浮雕效果(将灰色设为基准).浮雕效果通过让图像的一侧变亮, 另一侧变暗, 从而产生立体的光影感. 通常使用一个不对称的矩阵, 例如左上角为负, 右下角为正, 中间为 0.
01<filter id="demo1-emboss">02{/*03order="3": 3x3 矩阵04kernelMatrix:05-2 -1 006-1 1 1070 1 208左上角为负(压暗), 右下角为正(提亮), 产生光源在右下角的错觉.09bias="0.5": 将计算结果为 0 的区域(平坦区域)提升为中性灰, 而不是黑色.10*/}11<feConvolveMatrix12order="3"13kernelMatrix="-2 -1 0 -1 1 1 0 1 2"14divisor="1"15bias="0.5"16/>17</filter>
边缘检测用于提取图像的轮廓. 它的原理是寻找颜色发生剧烈变化的地方. 通过让中心像素的权重与周围像素的权重符号相反, 且总和为 0, 平坦区域(颜色相近)的结果就会变为 0(黑色), 而边缘区域(颜色差异大)则会保留下来.
01<filter id="demo2-edge">02{/*03kernelMatrix:040 1 0051 -4 1060 1 007中心是 -4, 四周 4 个 1, 总和为 0.08平坦区域:1+1+1+1 - 4 = 0 (黑色)09边缘区域:差异会被放大10*/}11<feConvolveMatrix12order="3"13kernelMatrix="0 1 0 1 -4 1 0 1 0"14preserveAlpha="true"15/>16</filter>1718<filter id="demo2-edge-neon">19{/* 更激进的边缘检测矩阵, 配合 Matrix 变色实现霓虹风格 */}20<feConvolveMatrix21order="3"22kernelMatrix="-1 -1 -1 -1 8 -1 -1 -1 -1"23/>24<feColorMatrix type="matrix" values="0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0" />25</filter>
锐化是摄影后期中不可或缺的一步. 它的原理与边缘检测类似, 但更为温和. 它通过增强中心像素的权重, 同时减去周围像素的权重, 来提高局部对比度, 使细节更加清晰. 注意矩阵数值的总和通常保持为 1, 以维持原图的整体亮度.
01<filter id="demo3-sharpen">02{/*03kernelMatrix:040 -1 005-1 5 -1060 -1 007总和:5 + (-4) = 1 (亮度不变)08中心像素被放大 5 倍, 然后减去周围的像素,09这会拉大像素间的差异, 从而提升清晰度.10*/}11<feConvolveMatrix12order="3"13kernelMatrix="0 -1 0 -1 5 -1 0 -1 0"14/>15</filter>
feConvolveMatrix 就像是像素世界的魔法棒. 只需要改变那几个数字, 就能产生完全不同的视觉效果.