如何旋转图像提取非空像素,用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
相关产品推荐
相关产品推荐

