如何使用Python提取图片右侧的两个图表(支持合并提取)
提取图片右侧两个图表的解决方案
针对你需要提取图片右侧两个图表的需求,现有代码仅筛选最大轮廓,无法精准定位目标区域。下面给你两种适合新手的实现方案:
方法一:基于坐标直接裁剪(简单易上手)
如果能确定右侧图表在图片中的大致位置,直接通过坐标裁剪是最快速的方案:
- 查看图片宽高,确定右侧区域的起始x坐标;
- 截取对应区域并保存即可。
修改后的代码:
import cv2 import numpy as np # 加载图片 image_path = r'C:\Prarthana\PROJECTS\GitHub\MajorProject\Images\1.jpg' image = cv2.imread(image_path) # 获取图片尺寸:(高度, 宽度, 通道数) height, width = image.shape[:2] # 定义右侧区域的起始x坐标(可根据实际图片调整比例,或用画图工具查看精准坐标) start_x = int(width * 0.5) # 裁剪右侧区域:保留整个高度,从start_x到图片最右侧 right_charts = image[:, start_x:] # 保存提取的图表 cv2.imwrite(r'C:\Prarthana\PROJECTS\GitHub\MajorProject\Images\output\extracted_right_charts.jpg', right_charts)
提示:用系统画图工具打开原图片,鼠标悬停在右侧图表左边缘,可查看底部状态栏的x坐标,替换start_x的数值能获得更精准的裁剪结果。
方法二:优化轮廓筛选(更通用)
如果需要自动识别右侧图表区域,可通过筛选矩形轮廓实现:
- 对边缘检测后的轮廓进行筛选,保留近似矩形的轮廓;
- 筛选出位置偏右的轮廓;
- 合并这些轮廓区域,生成掩码后提取图表。
修改后的代码:
import cv2 import numpy as np # 加载图片 image_path = r'C:\Prarthana\PROJECTS\GitHub\MajorProject\Images\1.jpg' image = cv2.imread(image_path) gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 预处理:模糊降噪+边缘检测 blurred = cv2.GaussianBlur(gray, (5, 5), 0) edges = cv2.Canny(blurred, 50, 150) # 查找所有外部轮廓 contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 筛选符合条件的轮廓:近似矩形、面积足够大、位置偏右 width = gray.shape[1] target_contours = [] for cnt in contours: # 计算轮廓的近似多边形 peri = cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, 0.02 * peri, True) # 筛选规则:近似矩形(4个顶点)、面积大于阈值、轮廓中心偏右 if len(approx) == 4: area = cv2.contourArea(cnt) if area > 10000: # 面积阈值根据实际图片调整 M = cv2.moments(cnt) cx = int(M['m10'] / M['m00']) if cx > width * 0.4: # 只保留中心在图片右侧40%区域的轮廓 target_contours.append(cnt) # 创建掩码并绘制所有目标轮廓 mask = np.zeros_like(gray) cv2.drawContours(mask, target_contours, -1, 255, thickness=cv2.FILLED) # 提取图表区域 extracted_charts = cv2.bitwise_and(image, image, mask=mask) # 保存结果 cv2.imwrite(r'C:\Prarthana\PROJECTS\GitHub\MajorProject\Images\output\extracted_right_charts.jpg', extracted_charts)
提示:如果提取结果不准确,可调整area > 10000的面积阈值,或cx > width * 0.4的位置比例。
推荐方案
作为Python新手,优先尝试方法一,操作简单,无需复杂的轮廓分析,确定坐标后就能快速得到结果。
内容的提问来源于stack exchange,提问作者Prarthana Shankar
相关产品推荐
相关产品推荐

