使用OpenCV和Python提取魔方颜色时如何实现魔方与背景的分离
魔方背景分离优化方案
前置优化:优先做颜色预过滤缩小候选范围
- 魔方的六个面仅包含白、黄、红、橙、蓝、绿六种高饱和度固定颜色,你可以先将图像从BGR色彩空间转换到HSV色彩空间,预先设置六种颜色的阈值范围,用
cv2.inRange()生成对应颜色的掩码后合并,直接把不在阈值内的背景像素全部置黑,仅保留符合魔方颜色特征的区域再做后续处理,能直接过滤掉绝大多数背景干扰。
针对现有流程的优化:给轮廓提取增加过滤规则
你当前的流程已经拿到了全图轮廓,只需要增加多层筛选逻辑就能剔除无效轮廓:
- 面积过滤:提前设置最小、最大面积阈值,丢掉面积过小的噪点轮廓,以及面积远大于魔方尺寸的背景大轮廓
- 长宽比过滤:魔方的单个面外轮廓是正方形,经过轮廓近似后的多边形长宽比应该接近1:1,偏离度超过20%的可以直接剔除
- 层级过滤:魔方单个面内部包含9个更小的正方形色块轮廓,符合特征的外轮廓必然嵌套有9个左右的子轮廓,没有对应子层级的轮廓可以直接排除
预处理步骤参数优化
- 在执行Canny边缘检测前先做一次高斯模糊,调用
cv2.GaussianBlur(img, (5,5), 0)即可,能大幅减少背景细碎纹理产生的无效边缘 - 按需调整Canny的高低阈值、膨胀操作的核大小与迭代次数,避免把背景的轻微纹理识别为有效边缘
补充校验逻辑避免误判
- 筛选出候选的魔方面轮廓后,可以通过透视变换将轮廓区域校正为正视角的正方形,再校验内部是否存在3×3的均匀色块网格,符合特征的才判定为魔方有效区域,进一步排除背景中误识别的正方形物体。

内容的提问来源于stack exchange,提问作者Pratik Hadawale
相关产品推荐
相关产品推荐

