使用摄像头采集轨道信息。经过比较使用“直方图双峰法”比较合适。
Prewitt 等人于六十年代中期提出的直方图双峰法(也称mode 法) 是典型的全局单阈值分割方法。 该方法的基本思想是:假设图像中有明显的目标和背景,则其灰度直方图呈双峰分布,当灰度级直方图具有双峰特性时,选取两峰之间的谷对应的灰度级作为阈值。
(将灰度图像转换为二值图像时,图像直方图可用于自动确定阈值。基本思想是在前景像素值的峰值和背景像素值的峰值之间找到一个点。如果像素的强度级别小于阈值,则将像素设置为黑色(灰度 = 0),否则将其设置为白色(灰度 = 255)。阈值就是分割线。)
难题在于这个阈值怎么找,因为在不同的光照条件下阈值不稳定(例如轨道在阴影下和光照下),所以随便设定一个不能解决问题。
考虑本实例中双峰图像特点:图像前景色确定(轨道颜色单纯、形状固定、面积占图片的比例相对固定)。
所以简化处理:根据前景色占比相对固定的特点,可将直方图中的灰度值分割为前景值和背景值。前景色的在直方图中对应的灰度值(横轴)范围可以根据色彩空间算出。将此灰度值范围内的对应的像素设置为黑色,将其余的设置为白色。
例如:图像大小600*400,轨道为黑色(#000000),在图像中占比为小于1/5,则在图像直方图中,黑色对应灰度值为0(最左侧),像素数量自左向右累计至 48000(600*400 /5),将对应的灰度值作为阈值,大于此阈值的像素值全部计零。
再例如:图像大小600*400,轨道为白色(#FFFFFF),在图像中占比为小于1/5,则在图像直方图中,白色对应灰度值为255(最右侧),像素数量自右向左累计至 48000(600*400 /5),将对应的灰度值作为阈值,小于此阈值的像素全部计零。
再例如:图像大小600*400,轨道为黄色(#FFFF00),在图像中占比为小于1/5,则在图像直方图中,黄色对应灰度值为227 ( 0.3 *255(R) + 0.59*255 (G) + 0.11*0(B) ),像素数量在该值两侧累计至 48000(600*400 /5),将对应的灰度值区间作为阈值,大于和小于此阈值区间的像素全部计零。
不成功的几种方法:
1)根据颜色识别。具体是通过HSV空间发现在外界光线不一的情况下,视频图片中轨道的颜色差异较大。
#颜色空间 # color dictory( HSV value ) # 黑 灰 白 红 橙 黄 绿 青 蓝 紫 # hmin 0 0 0 0,156 11 26 35 78 100 125 # hmax 180 180 180 10,180 25 34 77 99 124 155 # smin 0 0 0 43 43 43 43 43 43 43 # smax 255 43 30 255 255 255 255 255 255 255 # vmin 0 46 221 46 46 46 46 46 46 46 # vmax 46 220 255 255 255 255 255 255 255 255 #黑色是这样的值 TrackColorLower = np.array([0, 0, 0]) TrackColorUpper = np.array([180, 255, 46]) hsv = cv2.cvtColor(crop_img, cv2.COLOR_BGR2HSV) #去除颜色范围外的其余颜 mask = cv2.inRange(hsv, TrackColorLower,TrackColorUpper) print ( "hsv value" ) print ( mask[mask>0].size ) #画出来看看 plt.imshow( mask ) plt.show()
2)根据边缘识别:
在光线不均匀的条件下(窗户阴影),边缘识别不具备可移植性。