如何基于分割掩码裁剪图像保留主体以匹配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
相关产品推荐
相关产品推荐



