OpenCV如何获取轮廓外周边平均颜色及解决轮廓内部填充失败问题
问题解答
问题1:获取字符轮廓周边平均RGB颜色
没有现成的直接实现函数,可参考以下标准实现逻辑:
- 对单个字符轮廓,调用
cv2.boundingRect(cnt)拿到轮廓的外接矩形,将矩形上下左右各扩展3~5个像素(可根据字符大小调整)得到待采样区域。 - 新建和原图尺寸一致的单通道掩码:先用
thickness=-1填充当前轮廓到掩码,值设为255;再对掩码做和扩展宽度匹配的膨胀操作,得到包含轮廓+周边的区域掩码。 - 用膨胀后的掩码减去原轮廓填充掩码,得到仅包含轮廓外周边的掩码。
- 用该掩码和原图做按位与,提取出所有周边区域的像素点,过滤无效值后计算三个通道的平均值即可。
问题2:cv2.drawContours填充失效原因
该问题由两个错误共同导致:
- 传入轮廓检测的是Canny边缘检测的输出,边缘检测得到的线条是不闭合的,
cv2.drawContours仅能对闭合轮廓填充内部。 cv2.drawContours调用参数错误:第二个参数要求传入轮廓列表,你直接传单个轮廓cnt,且第三个参数填-1,会导致仅绘制轮廓线。
修复方案:
- 对Canny输出的二值图先做闭运算(先膨胀后腐蚀),补全字符边缘的缺口,得到闭合的字符区域后再做轮廓检测。
- 修正
drawContours的调用参数,把单个轮廓包进列表,第三个参数填0。
参考修复后的代码段:
def Contour(img): # 闭运算补全边缘缺口 kernel = np.ones((3,3), np.uint8) img_closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel, iterations=2) Contours,hierarchy = cv2.findContours(img_closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt in Contours: area = cv2.contourArea(cnt) if area < 15: # 过滤小噪点 continue # 修正参数:传入轮廓列表,指定绘制第0个轮廓 cv2.drawContours(imgcpy, [cnt], 0, (255,0,0), thickness=-1)
内容的提问来源于stack exchange,提问作者R44
相关产品推荐
相关产品推荐

