高斯模糊、LAB 锐化参数与自定义卷积核
虽然高级增强、局部对比与边缘检测展示了模糊与锐化的快速效果,但在生产环境中调节缩略图清晰度或去除噪点时,需要准确理解 gaussblur 的截断精度、sharpen 在 CIE LAB 空间下的六个阈值参数,以及**中值滤波(Rank / median)与自定义卷积矩阵(conv / convolve)**的跨绑定边界。
1. 高斯模糊(GaussianBlur / gaussblur):sigma 与 min_ampl
Section titled “1. 高斯模糊(GaussianBlur / gaussblur):sigma 与 min_ampl”libvips 的 vips_gaussblur 采用可分离一维高斯卷积核:
sigma:高斯分布标准差(模糊半径)。在缩略图柔化或背景羽化时常用1.0 ~ 5.0;大面积毛玻璃背景可用15.0 ~ 40.0。注意sharp.blur(sigma)要求sigma介于0.3到1000之间。min_ampl(最小振幅截断):控制高斯钟形曲线在边缘何处截断,默认值为0.2。如果需要更平滑的渐变光晕(减少大半径模糊时的块状条带),可在govips中传入第二个可选参数image.GaussianBlur(sigma, 0.05),或在sharp中设置minAmplitude: 0.05。

由 govips v2.20.0 / libvips 8.17.3 实际生成。
// 第二个参数 minAmpl 为可选参数(默认 0.2);越小核越宽、过渡越精细if err := image.GaussianBlur(4.0, 0.2); err != nil { return err}import sharp from 'sharp';
await sharp('input.jpg') .blur({ sigma: 4.0, minAmplitude: 0.2, precision: 'integer' }) .webp({ quality: 82 }) .toFile('blur.webp');import pyvips
image = pyvips.Image.new_from_file("input.jpg")blurred = image.gaussblur(4.0, min_ampl=0.2, precision="integer")blurred.write_to_file("blur.webp", Q=82)vips gaussblur input.jpg 'blur.webp[Q=82]' 4.0 --min-ampl 0.2 --precision integer2. LAB 亮度通道 USM 锐化(Sharpen)参数拆解
Section titled “2. LAB 亮度通道 USM 锐化(Sharpen)参数拆解”与在 RGB 通道上直接做拉普拉斯锐化不同,libvips 的 vips_sharpen 会先将图像转换到 CIE LAB 色彩空间,仅对 *L(亮度)通道**应用非锐化掩模(Unsharp Mask),从而避免在边缘产生彩色噪点或色相偏移。
它的核心分段线性传递函数由以下参数控制:
| 参数名 | 默认值 | 物理含义 | 调参建议 |
|---|---|---|---|
sigma |
0.5 |
高斯低通滤波半径 | 屏幕 1x/2x 缩略图常用 0.5 ~ 1.2;印刷大图可用 1.5 ~ 2.5 |
x1(flat/jagged 阈值) |
2.0 |
高频差值低于 x1 被视为平坦区,高于 x1 被视为边缘区 |
噪点较多的暗光照片可调大到 3.0 ~ 5.0,抑制平坦区噪点被放大 |
m1(平坦区斜率) |
1.0 |
对低于 x1 的微小纹理应用的锐化倍率 |
设为 0 可完全不对平坦区(如皮肤、夜空)做锐化 |
m2(锯齿边缘斜率) |
2.0 |
对高于 x1 的显著边缘应用的锐化倍率 |
缩略图微锐化常用 1.0 ~ 2.0;过高会产生白边光晕(Halo) |
y2 / y3(亮暗增幅上限) |
10.0 / 20.0 |
限制单像素最多允许变亮(y2)或变暗(y3)的 L* 幅度 |
防止高反差边缘过冲产生刺眼白边 |
注:govips 的 image.Sharpen(sigma, x1, m2) 接收 sigma、x1 和 m2 三个参数;sharp、pyvips 与 vips CLI 支持全部六个参数。

由 govips v2.20.0 / libvips 8.17.3 实际生成。
// Sharpen(sigma, x1, m2)if err := image.Sharpen(1.2, 2.0, 1.5); err != nil { return err}import sharp from 'sharp';
await sharp('input.jpg') .sharpen({ sigma: 1.2, m1: 1.0, m2: 1.5, x1: 2.0, y2: 10.0, y3: 20.0, }) .webp({ quality: 82 }) .toFile('sharpen.webp');import pyvips
image = pyvips.Image.new_from_file("input.jpg")sharpened = image.sharpen(sigma=1.2, x1=2.0, y2=10.0, y3=20.0, m1=1.0, m2=1.5)sharpened.write_to_file("sharpen.webp", Q=82)vips sharpen input.jpg 'sharpen.webp[Q=82]' --sigma 1.2 --x1 2.0 --m1 1.0 --m2 1.53. 中值滤波去椒盐噪点(Rank / median)与自定义卷积核(convolve / conv)
Section titled “3. 中值滤波去椒盐噪点(Rank / median)与自定义卷积核(convolve / conv)”- 中值滤波(Median / Rank Filter):在
w × h邻域内对像素排序并取中位数(index = (w*h)/2),能有效去除扫描件或高感光度照片中的椒盐噪点且不模糊边缘。四个绑定全部支持:govips调用image.Rank(3, 3, 4),sharp调用.median(3),pyvips调用.median(3)或.rank(3, 3, 4),vips CLI调用vips rank in out 3 3 4。 - 自定义二维卷积核(Custom Convolution):
sharp(.convolve())、pyvips(Image.new_from_array+.conv())与vips CLI(vips conv)支持传入任意M × N矩阵、scale与offset;而govips v2.19.0公开层仅暴露了固定算子Sobel(),未公开导出通用Conv方法。
// 3×3 窗口中值滤波(排序索引 4 即 9 个像素中的中位数)if err := image.Rank(3, 3, 4); err != nil { return err}
// 边缘检测:govips 公开了内置 Sobel(),未公开任意矩阵 Conv()if err := image.Sobel(); err != nil { return err}import sharp from 'sharp';
// 1. 3×3 中值滤波await sharp('input.jpg').median(3).webp({ quality: 82 }).toFile('median.webp');
// 2. 自定义 3×3 浮雕 (Emboss) 卷积核,指定 scale=1 与 offset=128await sharp('input.jpg') .convolve({ width: 3, height: 3, kernel: [-2, -1, 0, -1, 1, 1, 0, 1, 2], scale: 1, offset: 128, }) .webp({ quality: 82 }) .toFile('emboss.webp');import pyvips
image = pyvips.Image.new_from_file("input.jpg")
# 1. 3×3 中值滤波median = image.median(3)
# 2. 自定义 3×3 卷积核(scale 与 offset 挂载在矩阵图像属性上)kernel = pyvips.Image.new_from_array( [[-2, -1, 0], [-1, 1, 1], [0, 1, 2]], scale=1.0, offset=128.0,)emboss = image.conv(kernel, precision="integer")emboss.write_to_file("emboss.webp", Q=82)# 3×3 中值滤波vips rank input.jpg 'median.webp[Q=82]' 3 3 4