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

Python去除图像边距校正倾斜 同步变换到对应分割掩码

图像边距去除+倾斜校正同步处理方案(适配分割任务)

处理全程保证原图和分割掩码的像素严格对齐,核心流程如下:

实现步骤

  • 核心区域轮廓检测:将原始输入转灰度图后做二值化,过滤最外层黑边、中间白边的像素区域,提取面积最大的连通域轮廓,该轮廓即为包含自带黑背景的倾斜核心图像区域的外边界。
  • 倾斜角度计算与同步旋转:基于提取到的核心轮廓计算最小外接旋转矩形,读取矩形的旋转角度并做范围校准,生成统一的仿射变换矩阵。注意:旋转原图和分割掩码必须使用完全相同的变换矩阵,原图插值可选用双线性/双三次插值保证画质,分割掩码必须使用最近邻插值cv2.INTER_NEAREST,避免掩码标签值被插值运算篡改生成无效标签。
  • 同步裁剪边距:旋转校正完成后,再次检测核心区域的正向外接矩形,使用完全一致的裁剪坐标,同时对旋转后的原图、旋转后的掩码做裁剪,即可去除所有外围黑边、白边,得到垂直对齐的核心图像与对应分割掩码。

可直接复用的Python+OpenCV实现代码

import cv2
import numpy as np

def process_img_and_mask(img_path, mask_path, save_img_path, save_mask_path):
    # 读入原图和掩码,掩码按灰度模式读取保证标签值正确
    img = cv2.imread(img_path)
    mask = cv2.imread(mask_path, cv2.IMREAD_GRAYSCALE)
    h, w = img.shape[:2]

    # 第一步:二值化检测核心区域轮廓
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 阈值过滤掉纯白边、纯黑外层边,提取核心区域
    _, thresh = cv2.threshold(gray, 20, 255, cv2.THRESH_BINARY)
    contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    # 取最大的外接轮廓即为核心区域
    main_contour = max(contours, key=cv2.contourArea)
    # 获取最小外接旋转矩形,返回值 (中心(x,y), (宽,高), 旋转角度)
    rect = cv2.minAreaRect(main_contour)
    angle = rect[-1]
    # 角度校准,适配OpenCV返回的角度范围
    if angle < -45:
        angle = 90 + angle
    # 生成统一旋转矩阵
    M = cv2.getRotationMatrix2D(rect[0], angle, 1.0)
    # 同步旋转原图和掩码,掩码必须用最近邻插值
    rotated_img = cv2.warpAffine(img, M, (w, h), flags=cv2.INTER_CUBIC, borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))
    rotated_mask = cv2.warpAffine(mask, M, (w, h), flags=cv2.INTER_NEAREST, borderMode=cv2.BORDER_CONSTANT, borderValue=0)

    # 第二步:裁剪外围多余边距
    gray_rot = cv2.cvtColor(rotated_img, cv2.COLOR_BGR2GRAY)
    _, thresh_rot = cv2.threshold(gray_rot, 20, 255, cv2.THRESH_BINARY)
    x, y, crop_w, crop_h = cv2.boundingRect(thresh_rot)
    # 用相同坐标同步裁剪
    cropped_img = rotated_img[y:y+crop_h, x:x+crop_w]
    cropped_mask = rotated_mask[y:y+crop_h, x:x+crop_w]

    # 保存结果
    cv2.imwrite(save_img_path, cropped_img)
    cv2.imwrite(save_mask_path, cropped_mask)
    return cropped_img, cropped_mask

# 调用示例
if __name__ == "__main__":
    # 替换为实际的文件路径
    process_img_and_mask("original.jpg", "mask.png", "processed_img.jpg", "processed_mask.png")

注意事项

  • 禁止单独对原图、掩码分别计算旋转/裁剪参数,所有几何变换的矩阵、坐标参数必须完全复用,否则会出现图像和掩码像素错位,导致分割标签失效。
  • 如果输入图像边缘存在零散噪点影响轮廓检测,可以在二值化后增加一次3x3核的形态学开运算去除噪点,不会影响核心区域的检测精度。
  • 批量处理前先抽几对结果做像素对齐校验,确认核心内容和掩码区域完全匹配后再跑全量数据集。

示例素材参考

示例原始图像
对应分割掩码


内容的提问来源于stack exchange,提问作者Shufan Xia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:15:37