如何使用Python去除茶叶图像背景,仅保留单片茶叶区域
茶叶图像背景去除实现方案
通用的OpenCV背景去除方案大多没有针对茶叶和浅背景的颜色特征做优化,所以直接套用效果不佳。你可以用HSV颜色空间做特征分割,适配这类目标和背景颜色差异明显的场景,完整实现流程和代码如下:
实现步骤
- 转换颜色空间:将默认读取的BGR格式图像转为HSV空间,该空间分离了色相、饱和度、明度三个维度,能大幅降低光照变化对颜色判断的干扰
- 设定分割阈值:根据茶叶的颜色范围设定HSV高低阈值,过滤掉背景区域,样例图像的初始可用阈值范围为
lower_tea = (10, 20, 20)、upper_tea = (90, 255, 255),你可以根据自己的全量数据集微调数值 - 优化掩码:初始生成的分割掩码会有噪点和空洞,用形态学开运算去除背景区域的零散噪点,再用闭运算填补茶叶区域的小孔
- 生成结果:将掩码作为alpha通道和原图像合并,输出透明背景的茶叶图像
可运行代码
import cv2 import numpy as np def remove_tea_bg(input_path, output_path): # 读取输入图像 img = cv2.imread(input_path) # 转换到HSV颜色空间 hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 茶叶HSV阈值,可根据实际数据调整 lower_bound = np.array([10, 20, 20]) upper_bound = np.array([90, 255, 255]) # 生成初始分割掩码 mask = cv2.inRange(hsv_img, lower_bound, upper_bound) # 形态学操作优化掩码 kernel = np.ones((5, 5), np.uint8) # 开运算去除背景噪点 mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel, iterations=2) # 闭运算填补茶叶内部空洞 mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel, iterations=2) # 合并alpha通道生成透明背景图 b, g, r = cv2.split(img) result_img = cv2.merge((b, g, r, mask)) # 保存为png格式保留透明通道 cv2.imwrite(output_path, result_img) # 调用示例 # remove_tea_bg("tea_input.jpg", "tea_output.png")
优化建议
- 如果你的数据集包含不同品类的干茶(比如红茶、乌龙茶等颜色偏褐红的茶叶),可以先对每个品类单独标定HSV阈值,分割精度会更高
- 如果茶叶边缘有杂色残留,可以对最终掩码做1-2次高斯模糊后再合并,边缘过渡会更自然
- 遇到茶叶和背景颜色接近的特殊样本时,可以将本方案得到的掩码作为初始输入传入GrabCut算法做二次优化,比直接调用GrabCut的效率和精度都更高
内容的提问来源于stack exchange,提问作者Katara
相关产品推荐
相关产品推荐

