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

如何旋转图像提取非空像素,用numpy对齐倾斜矩形并去除蓝色背景

倾斜矩形区域提取与校正实现方案

核心实现逻辑

你需要依次完成颜色过滤保留黄绿像素、定位倾斜矩形边界、透视变换对齐坐标轴三个步骤,以下是可直接运行的实现方案:

完整代码示例

import numpy as np
import cv2

# 读取本地存储的图像numpy数组,示例读npy格式:
# img_arr = np.load("你的数组文件路径.npy")
# 数组格式要求:shape为(高度, 宽度, 3),dtype为uint8,通道顺序为RGB/BGR可对应调整下方阈值

# --------------------------
# 步骤1:过滤蓝色背景,保留黄绿像素
# --------------------------
r, g, b = img_arr[..., 0], img_arr[..., 1], img_arr[..., 2]
# 阈值可根据实际像素分布微调,以下规则适配示例图特征:G通道远高于B通道,R、G通道值不低
mask = (g > b + 25) & (r > 40) & (g > 60)
# 背景区域设为纯白,需要透明背景可额外加alpha通道处理
img_arr[~mask] = [255, 255, 255]

# --------------------------
# 步骤2:定位倾斜矩形的四个角点
# --------------------------
# 基于掩码生成二值图
binary_mask = (mask * 255).astype(np.uint8)
# 提取轮廓,取最大轮廓即为目标矩形
contours, _ = cv2.findContours(binary_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
target_contour = max(contours, key=cv2.contourArea)
# 计算最小外接旋转矩形,获取四个角点坐标
rot_rect = cv2.minAreaRect(target_contour)
rect_corners = cv2.boxPoints(rot_rect).astype(np.int64)

# --------------------------
# 步骤3:透视变换对齐坐标轴
# --------------------------
rect_w, rect_h = int(rot_rect[1][0]), int(rot_rect[1][1])
# 定义校正后目标矩形的四个角点坐标
dst_corners = np.float32([
    [0, rect_h - 1],
    [0, 0],
    [rect_w - 1, 0],
    [rect_w - 1, rect_h - 1]
])
# 计算透视变换矩阵
transform_mat = cv2.getPerspectiveTransform(rect_corners.astype(np.float32), dst_corners)
# 执行变换得到对齐后的结果
aligned_result = cv2.warpPerspective(img_arr, transform_mat, (rect_w, rect_h))

# 结果保存示例
# np.save("校正后数组.npy", aligned_result)
# cv2.imwrite("校正后图片.png", aligned_result)

注意事项

  • 如果你的数组是0-1范围的浮点型像素值,将代码中的阈值等比例缩小255倍即可
  • 纯numpy也可以实现透视变换,但是需要手动计算变换矩阵、遍历像素做坐标映射,效率远低于OpenCV的优化实现,更推荐上述方案
  • 颜色过滤的阈值可以根据你实际数组的像素分布微调,适配你的场景即可

内容的提问来源于stack exchange,提问作者Bernard Reznik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 10:39:03