如何使用Python对指定颜色范围内的选中边界图像进行裁剪
实现按指定颜色范围裁剪图像的Python方案
实现思路
- 读取目标图像后转换为HSV色彩空间,相比RGB色彩空间更适合做颜色范围的精准筛选
- 校准指定颜色对应的HSV上下阈值,阈值可根据你的参考色灵活调整容错范围
- 根据阈值生成掩膜,筛选出所有落在指定颜色范围内的像素区域
- 计算掩膜中非零像素的最小外接矩形,即为选中边界
- 按照该边界裁切原图像输出即可
依赖安装
运行前先安装依赖库:pip install opencv-python numpy pillow
完整可运行代码
import cv2 import numpy as np from PIL import Image def crop_by_color_range(img_path, lower_hsv, upper_hsv, output_path="cropped_result.png"): # 读取输入图像 img = cv2.imread(img_path) if img is None: raise ValueError("图像读取失败,请检查路径是否正确") # 将图像从BGR格式转换为HSV格式 hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 生成符合颜色范围的掩膜 mask = cv2.inRange(hsv_img, lower_hsv, upper_hsv) # 获取所有符合颜色要求的像素坐标 y_coords, x_coords = np.nonzero(mask) if len(x_coords) == 0 or len(y_coords) == 0: raise ValueError("未检测到指定颜色范围内的像素,请调整阈值后重试") # 计算选中区域的边界坐标 x_min, x_max = x_coords.min(), x_coords.max() y_min, y_max = y_coords.min(), y_coords.max() # 裁切图像并保存 cropped = img[y_min:y_max+1, x_min:x_max+1] cropped_rgb = cv2.cvtColor(cropped, cv2.COLOR_BGR2RGB) Image.fromarray(cropped_rgb).save(output_path) return output_path if __name__ == "__main__": # 示例为蓝色范围的HSV阈值,可根据你的目标颜色替换对应阈值 lower_target = np.array([100, 50, 50]) upper_target = np.array([130, 255, 255]) crop_by_color_range("替换为你的输入图像路径", lower_target, upper_target)
阈值校准方法
如果不知道目标颜色对应的HSV阈值,可以截取目标颜色的小样本图,运行以下代码获取对应HSV值后,设置±10的容错范围作为上下限即可:
# 读取目标颜色小样图,取单个像素的HSV值作为参考 sample_bgr = cv2.imread("目标颜色小样图路径")[0][0] sample_hsv = cv2.cvtColor(np.uint8([[sample_bgr]]), cv2.COLOR_BGR2HSV)[0][0] print(f"目标颜色参考HSV值:{sample_hsv}")
内容的提问来源于stack exchange,提问作者Hamster Fever
相关产品推荐
相关产品推荐

