You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于分割掩码裁剪图像保留主体以匹配3:4宽高比

基于主体边界框的3:4比例无裁切裁剪实现

核心逻辑

裁剪框只需同时满足三个条件即可达到需求:

  • 宽高比严格为3:4
  • 完全包裹已计算得到的主体边界框,不会裁切到主体内容
  • 裁剪范围不超出原图边界
    优先保证主体在裁剪框内居中,若居中会超出原图边界则自动向边缘对齐。

完整实现代码

你可以在已有的边界框计算代码后追加如下逻辑:

# 可配置参数
TARGET_RATIO = 3 / 4  # 目标宽高比3:4
PADDING = 0  # 可设置主体周围的预留边距(单位像素),不需要留空则设为0

# 获取原图尺寸、主体尺寸
img_h, img_w = out_layer.shape[:2]
subject_w = endx - startx + PADDING * 2
subject_h = endy - starty + PADDING * 2

# 初步计算满足比例、可完整包裹主体的最小裁剪框尺寸
subject_ratio = subject_w / subject_h
if subject_ratio > TARGET_RATIO:
    # 主体相对更宽,以宽度为基准计算对应高度
    crop_w = subject_w
    crop_h = crop_w / TARGET_RATIO
else:
    # 主体相对更高,以高度为基准计算对应宽度
    crop_h = subject_h
    crop_w = crop_h * TARGET_RATIO

# 修正裁剪框尺寸,确保不超过原图大小
if crop_w > img_w:
    crop_w = img_w
    crop_h = crop_w / TARGET_RATIO
if crop_h > img_h:
    crop_h = img_h
    crop_w = crop_h * TARGET_RATIO

# 计算裁剪框初始位置,优先让主体居中
crop_x1 = startx - PADDING - (crop_w - subject_w) / 2
crop_y1 = starty - PADDING - (crop_h - subject_h) / 2

# 修正裁剪框位置,确保不超出原图边界
crop_x1 = max(0, int(crop_x1))
crop_y1 = max(0, int(crop_y1))
crop_x2 = crop_x1 + int(crop_w)
crop_y2 = crop_y1 + int(crop_h)

# 若裁剪右下角超出边界,自动往左/上偏移调整
if crop_x2 > img_w:
    crop_x1 = img_w - int(crop_w)
    crop_x2 = img_w
if crop_y2 > img_h:
    crop_y1 = img_h - int(crop_h)
    crop_y2 = img_h

# 执行裁剪
origin_img = cv2.imread("你的原图路径.jpg", cv2.IMREAD_UNCHANGED) # 保留透明通道需使用IMREAD_UNCHANGED参数
cropped_img = origin_img[crop_y1:crop_y2, crop_x1:crop_x2]

# 保存结果
cv2.imwrite("裁剪后结果.png", cropped_img)

本次使用素材

分割掩码原图
分割掩码原图

内容的提问来源于stack exchange,提问作者Monark Unadkat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:45:04