跳转到内容

智能裁剪(Smart Crop)、焦点与自动去白边

复制本页

当输入图像的宽高比与目标卡片不一致时,除了居中裁剪(Centre Crop)外,libvips 还提供两类高价值的内容感知裁剪能力:

  1. 智能焦点裁剪(smartcrop / Interesting):通过信息熵(entropy)或视觉显著性(attention)自动寻找画面主体并保留最关键的矩形区域。
  2. 自动裁除纯色/透明边框(find_trim / trim):检测四周与背景色相近的空白边距并返回紧凑包围盒(Bounding Box),广泛用于电商商品白底图与带透明余量的图标裁剪。

中心、方向偏移与信息熵裁剪结果对比

Section titled “中心、方向偏移与信息熵裁剪结果对比”

以下三张 600 × 300 画布均由 1938 × 1292 原图经缩略图裁剪生成,分别展示中心裁剪(centre)、向低坐标偏移(north / low)以及按信息熵自动寻焦(entropy):

以几何中心裁剪生成的 600×300 夜景
cover centre600 × 300,33,898 字节
保留上方建筑塔冠的 600×300 夜景
cover north (low)600 × 300,29,562 字节
按信息熵自动寻焦裁剪的 600×300 夜景
cover entropy600 × 300,33,656 字节

独立调用 SmartCrop(Entropy vs Attention)

Section titled “独立调用 SmartCrop(Entropy vs Attention)”

如果业务不仅要在缩略图阶段使用智能裁剪,而是需要在当前分辨率(或自定义缩放后)直接做内容感知裁剪,可以直接调用 SmartCrop(libvips vips_smartcrop):

  • InterestingEntropy(entropy):将图像切分为网格,计算香农信息熵(Shannon Entropy),优先保留纹理与边缘细节最丰富的区域。
  • InterestingAttention(attention):综合考量高饱和度区域、亮度对比与肤色特征,适合人像与主体突出的摄影作品。
package main
import (
"fmt"
"os"
"github.com/davidbyttow/govips/v2/vips"
)
func main() {
if err := vips.Startup(nil); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
defer vips.Shutdown()
image, err := vips.NewImageFromFile("input.jpg")
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
defer image.Close()
// 在当前图像上按视觉显著性 (Attention) 智能裁剪出 600×300 区域
if err := image.SmartCrop(600, 300, vips.InterestingAttention); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
data, _, err := image.ExportWebp(vips.NewWebpExportParams())
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
if err := os.WriteFile("smart-attention.webp", data, 0o644); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(1)
}
}
裁剪焦点意图 govips vips.Interesting sharp position pyvips / vips CLI
不裁剪(仅按比例适应) vips.InterestingNone fit: 'inside' "none"
几何中心 vips.InterestingCentre 'centre' / 'center' "centre"
偏向低坐标边(上边缘或左边缘) vips.InterestingLow 'north' 或 'west' "low"
偏向高坐标边(下边缘或右边缘) vips.InterestingHigh 'south' 或 'east' "high"
信息熵最高区域 vips.InterestingEntropy sharp.strategy.entropy / 'entropy' "entropy"
视觉显著性最高区域 vips.InterestingAttention sharp.strategy.attention / 'attention' "attention"

自动裁除纯色或透明白边(FindTrim / trim)

Section titled “自动裁除纯色或透明白边(FindTrim / trim)”

当商品图或扫描件四周带有大面积纯白(或任意近色)边框时,可以使用 find_trim 自动定位非背景区域的像素边界 (left, top, width, height):

  • govips、pyvips 与 vips CLI 采用两步组合:先调用 FindTrim / find_trim 计算紧凑包围盒坐标,再校验 width > 0 && height > 0 后调用 ExtractArea / crop 裁切。
  • sharp 提供一步到位的 .trim({ background, threshold }) 方法,并在 OutputInfo 中返回 trimOffsetLeft 与 trimOffsetTop。
// 检测与白色背景 (#FFFFFF) 差值超过 threshold=10 的主体包围盒
bg := &vips.Color{R: 255, G: 255, B: 255}
left, top, width, height, err := image.FindTrim(10.0, bg)
if err != nil {
return err
}
if width <= 0 || height <= 0 {
return fmt.Errorf("entire image matched background threshold")
}
// 按探测到的包围盒执行裁剪
if err := image.ExtractArea(left, top, width, height); err != nil {
return err
}