如何将OpenCV轮廓提取后被框标注的图像单独保存?
实现方案
你当前的代码已经完成了轮廓筛选、最小外接矩形提取的核心逻辑,只需要新增裁剪、保存区域的代码即可,以下是两种常用的实现方式:
方案1:轴对齐矩形裁剪(简单实现,无需处理倾斜)
如果不需要修正轮廓的倾斜角度,直接裁剪外接矩形的轴对齐区域即可,修改后的完整代码如下:
import cv2 import numpy as np # 这里保留你原来的变量定义:dilation2是二值膨胀后的图,img是原始输入图 region = [] contours, hierarchy = cv2.findContours(dilation2, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) for i in range(len(contours)): cnt = contours[i] # 计算轮廓面积,筛除小面积区域 area = cv2.contourArea(cnt) if area < 80: continue # 查找最小外接矩形 rect = cv2.minAreaRect(cnt) # box存储矩形四个顶点坐标 box = cv2.boxPoints(rect) box = np.int0(box) # 计算高度和宽度 height = abs(box[0][1] - box[2][1]) width = abs(box[0][0] - box[2][0]) # 根据文本特征筛除过瘦的矩形,保留扁平矩形 if height > width * 3: continue region.append(box) # 这里新增裁剪保存逻辑,如果你不需要在绘制了轮廓的图上裁剪,就用img的原始副本 for idx, box in enumerate(region): # 先获取矩形的x、y轴极值,得到轴对齐的裁剪范围 x_min = np.min(box[:, 0]) x_max = np.max(box[:, 0]) y_min = np.min(box[:, 1]) y_max = np.max(box[:, 1]) # 裁剪区域 crop_img = img[y_min:y_max, x_min:x_max] # 保存文件,按序号命名 cv2.imwrite(f"contour_{idx}.png", crop_img) # 绘制轮廓 cv2.drawContours(img, [box], 0, (0, 255, 0), 1) cv2.imshow('img', img) cv2.waitKey(0) cv2.destroyAllWindows()
方案2:倾斜矩形转正裁剪(适合文本类倾斜区域,输出更规整)
如果你的轮廓是倾斜的文本,需要转正后再保存,可以通过仿射变换实现,只需要修改上面的裁剪保存部分的代码:
for idx, box in enumerate(region): rect = cv2.minAreaRect(box) # 获取矩形的中心点、宽高、旋转角度 center, size, angle = rect # 生成旋转矩阵 M = cv2.getRotationMatrix2D(center, angle, 1.0) # 对整图做旋转 rotated = cv2.warpAffine(img, M, (img.shape[1], img.shape[0])) # 裁剪旋转后的矩形区域 crop_img = cv2.getRectSubPix(rotated, (int(size[0]), int(size[1])), center) # 保存文件 cv2.imwrite(f"contour_{idx}.png", crop_img) # 绘制轮廓 cv2.drawContours(img, [box], 0, (0, 255, 0), 1)
注意事项
- 如果你希望保存的是没有绿色轮廓线的原始区域,把裁剪逻辑放到
cv2.drawContours之前执行即可 - 保存路径如果不是当前工作目录,需要把
imwrite的第一个参数改成完整路径,比如f"C:/save_path/contour_{idx}.png" - 代码里的
img是你的原始输入图像,不要用二值化、膨胀后的处理图做裁剪
内容的提问来源于stack exchange,提问作者Charlie
相关产品推荐
相关产品推荐

