基于OpenCV的Python药片分割:非机器学习类边缘检测方案问询
无需机器学习的药片个体分割方案(基于Canny与传统图像处理)
核心思路:先色彩粗分割提纯区域,再针对性做边缘检测
不用直接在全图跑Canny,先把药片区域从背景里抠出来,再处理边缘就能避开背景干扰,同时解决双色药片的识别问题。
步骤1:色彩通道精准提取
- 用LAB色彩空间的a通道:这个通道对红/绿色差的敏感度远高于灰度图,能轻松把红色系药片(包括双色片的红色部分)和背景、黄色药片分开;
- 用HSV的H通道提取黄色药片:设定H值范围(比如20-35),直接阈值分割出黄色区域;
- 把a通道和H通道的分割结果做位或运算,得到覆盖所有药片的粗掩码。
步骤2:掩码优化(解决空洞与粘连)
- 对粗掩码先做膨胀(椭圆核
(5,5)),填补药片内部的小空洞;再做腐蚀(同尺寸椭圆核),去掉背景噪点,同时弱化药片间的粘连边界; - 双色药片的红色+黄色区域会被完整覆盖,不会出现掩码遗漏的问题。
步骤3:掩码约束下的Canny边缘检测
- 把原始灰度图和优化后的掩码做位与操作,只保留药片区域的灰度信息,完全屏蔽背景;
- 对提纯后的灰度图做高斯模糊(核
(5,5),sigmaX=1.5),再用Canny检测边缘:高低阈值设为50/150(可根据实际调整),此时边缘只会出现在药片区域,不会被背景杂讯干扰,能得到清晰的药片轮廓。
步骤4:粘连药片的最终分割
- 用
cv2.findContours提取轮廓,通过轮廓面积过滤掉小噪点(比如面积小于2000的直接丢弃,根据药片实际尺寸调整); - 对少量仍粘连的轮廓,用距离变换+分水岭算法(纯传统图像处理):对掩码做距离变换,找到距离局部最大值的点作为种子,再用分水岭分割粘连区域,实现完全的个体分割。
后续区分药片
得到独立轮廓后,可通过轮廓的外接矩形尺寸、轮廓内的平均颜色(从原始RGB图提取),轻松区分不同类型的药片。
内容的提问来源于stack exchange,提问作者qazimodo123
相关产品推荐
相关产品推荐

