zoukankan      html  css  js  c++  java
  • 循*迹小车轨道识别算法

    使用摄像头采集轨道信息。经过比较使用“直方图双峰法”比较合适。

    Prewitt 等人于六十年代中期提出的直方图双峰法(也称mode 法) 是典型的全局单阈值分割方法。 该方法的基本思想是:假设图像中有明显的目标和背景,则其灰度直方图呈双峰分布,当灰度级直方图具有双峰特性时,选取两峰之间的谷对应的灰度级作为阈值。

    具体表述:

    Image histogram can be used to automatically determine the value of the threshold to be used for converting a grayscale image to a binary image. The basic idea is to find a point between the peak of the foreground pixel values and the peak of the background pixel values. If the intensity level of a pixel is smaller than the threshold, the pixel is set to black (grayscale = 0), otherwise, it is set to white (grayscale = 255). The threshold serves as a dividing line.()

     
    (将灰度图像转换为二值图像时,图像直方图可用于自动确定阈值。基本思想是在前景像素值的峰值和背景像素值的峰值之间找到一个点。如果像素的强度级别小于阈值,则将像素设置为黑色(灰度 = 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)根据边缘识别:

    在光线不均匀的条件下(窗户阴影),边缘识别不具备可移植性。


    范晨鹏
    ------------------
    软件是一种态度
    成功是一种习惯


  • 相关阅读:
    Java Iterator模式
    .NET中的异常和异常处理
    .NET 中的DateTime
    .NET中的StringBuilder
    .NET中的计时器控件Timer
    .NET中的字符串你了解多少?
    必须会的SQL语句(八)数据库的完整性约束
    必须会的SQL语句(七)字符串函数、时间函数
    必须会的SQL语句(六)查询
    必须会的SQL语句(五)NULL数据处理和类型转换
  • 原文地址:https://www.cnblogs.com/diylab/p/15627152.html
Copyright © 2011-2022 走看看