基于OpenCV(Python)从灰度图像中统计车轮总辐条数及断裂辐条数
马车车轮辐条数(总条数+断裂条数)统计方案
刚好之前做过类似的车轮辐条检测项目,给你一套针对性的解决方案,在你描述的这类灰度图像场景(车轮白色连通组件、背景黑色、已知轴心)下非常好用:
一、先做预处理,扫清干扰
- 第一步先做二值化:用OpenCV的
cv2.threshold()函数把灰度图转成纯黑白二值图,确保辐条是纯白色,背景完全是黑色,这样后续检测不会受灰度渐变影响。 - 如果图像有小噪点,先跑一遍中值滤波:
cv2.medianBlur(img, 3),把零星的噪点去掉,避免误判成断裂的辐条片段。
二、核心操作:极坐标转换把辐条变直线
因为辐条是从轴心向外辐射的,直接处理笛卡尔坐标的话,辐条是斜线,不好统计。转成极坐标后,每条辐条会变成垂直的竖线,瞬间就好处理了:
- 用
cv2.warpPolar()函数,以已知的轴心(cx, cy)为原点,把图像转换成极坐标。参数里要设置好车轮的最大半径(可以从图像中先估算出来,比如从轴心到车轮边缘的距离),确保整个车轮都被包含进转换后的图像里。 - 转换后,原来的圆周角度对应新图像的x轴,半径对应y轴,每条辐条就是一条从顶部到底部的竖线(完整的话)。
三、统计总辐条数
- 对转换后的极坐标图像做水平投影:统计每一列(对应原图像的一个角度)的白色像素总数。正常情况下,有辐条的列会有很高的像素值,没有的列几乎为0。
- 用峰值检测找这些高值的数量:比如用
scipy.signal.find_peaks(),设置合适的高度阈值(过滤掉噪声的小峰值),找到的峰值数量就是总辐条数。
四、统计断裂辐条数
断裂的辐条在极坐标图像里是不连续的竖线,所以可以这样检测:
- 遍历极坐标图像的每一列(每一列对应一条辐条),统计该列中白色连通组件的数量。完整的辐条只有1个连通组件,断裂的辐条会分成2段甚至更多。
- 怎么统计连通组件?可以用
cv2.connectedComponents()函数,对单列图像(或者把列转成一维后找连续的白色段)计算连通块数量。把所有连通块数量>1的列数加起来,就是断裂辐条数。
一些实用小技巧
- 如果你的轴心定位有一点点偏差,建议先做个轴心微调:以初始轴心为中心,在5-10像素的范围内搜索,找到能让极坐标投影峰值最尖锐的点,这样转换后的辐条更清晰,统计更准确。
- 要是图像光照不均,先做直方图均衡化:
cv2.equalizeHist(img),增强辐条和背景的对比度,让后续二值化更彻底。
内容的提问来源于stack exchange,提问作者dzimiks
相关产品推荐
相关产品推荐

