美文网首页程序员程序员首页投稿首页投稿(暂停使用,暂停投稿)
新手向——通过街头图像评估纽约市自行车道的质量

新手向——通过街头图像评估纽约市自行车道的质量

作者: treelake | 来源:发表于2017-07-28 15:20 被阅读246次

    Measuring the quality of NYC Bike Lanes through street imagery

    • 另一篇文章中,我介绍了如何使用Open Street Cam(OSC)应用收集街道图像,在这片文章中,我将简单介绍我们对街道图像使用到的图像处理和计算机视觉技术。
      我们也尝试过使用 微软定制视觉 产品,根据简单标记的自行车道图像,快速生成分类结果。

    • python拥有强大的图像处理能力,这里用到了广受欢迎的openCVSciPy库。

    • Greg Dobler教授是NYU CUSP的图像处理专家,我们咨询了他来帮助我们构建这些算法。

    • 我们尝试结合四种方式来评估自行车道质量,并借鉴NACTO的“城市街道设计指南”

      1. 骑行质量,使用前面提到的app记录的加速度数据测量。
      2. 自行车道的颜色,绿色车道相比没有涂色的车道质量更高,因为它们的可见性更好。
      3. 符号和路面标记,良好标记的车道质量更好。
      4. 可见道路缺陷,如裂缝和坑洼,越少越好。
    • 以下重点是测量路面标记和可见缺陷。这是一个幼稚的评分系统,也是程序的第一次迭代(类似于许多计算机视觉应用)。

    检测车道标记

    • 使用SciPy读取原始图像并显示
    import scipy.ndimage as nd
    photoName = 'path'
    img = nd.imread(photoName)
    
    import matplotlib.pylab as plt
    def plti(im, **kwargs):
        """
        画图的辅助函数
        """
        plt.imshow(im, interpolation="none", **kwargs)
        plt.axis('off') # 去掉坐标轴
        plt.show() # 弹窗显示图像
    plti(img)
    
    • 裁去图片的上半截(去除非自行车道的特征)和底部10%(去除我的自行车轮胎)(上图没有显示出来这个特点)
    #图片的行数和列数
    nrow, ncol = img.shape[:2]
    #从行数的一半开始 直到 0.9行数
    img = img[nrow//2:(nrow-nrow//10),:,:]
    
    plti(img)
    
    • 使用颜色阈值过滤裁剪后的图像,生成二值图(黑白图)
    #分离出三层色彩
    red, grn, blu = img.transpose(2, 0, 1)
    #应用阈值处理
    thrs = 200
    wind = (red > thrs) & (grn > thrs) & (blu > thrs)
    
    plti(wind)
    
    • 接着使用高斯模糊,带宽值为40像素
    # 使用高斯滤波模糊白色区块
    gf = nd.filters.gaussian_filter
    blurPhoto = gf(1.0 * wind, 40)
    
    plti(blurPhoto)
    
    • 再次设定阈值,0、1二值图像
    # 阈值位于黑白之间的灰色区域
    # 像素值大于阈值为1,小于为0
    threshold = 0.16
    wreg = blurPhoto > threshold
    
    plti(wreg)
    

    于是得到该车道标记的最终得分:在最后一张图中白色区域(即车道标记)的占比(wreg.mean())。这里是13.2%。

    检测可见道路缺陷

    • 读取图片
    import scipy.ndimage as nd
    photoName = r'path'
    img = nd.imread(photoName)
    
    plti(img)
    
    • 同上面一样的裁剪
    #图片的行数和列数
    nrow, ncol = img.shape[:2]
    #从行数的一半开始 直到 0.9行数
    img = img[nrow//2:(nrow-nrow//10),:,:]
    
    plti(img)
    
    md = nd.filters.median_filter
    # 模糊图像
    md_blurPhoto = md(img, 5)
    plti(md_blurPhoto)
    
    • 将图像从RGB转换为HSV,并过滤图像以仅保留较暗(缺陷)像素
    import cv2
    lower = np.array([0, 10, 50])
    upper = np.array([360, 100, 100])
    hls = cv2.cvtColor(md_blurPhoto, cv2.COLOR_BGR2HSV)
    mask = cv2.inRange(hls, lower, upper)
    res = cv2.bitwise_and(hls, hls, mask = mask)
    
    • 边缘检测,使用canny边缘检测
      我们还在图像上应用了3x3高斯滤波器,然后对剩余的白色像素进行侵蚀/扩展操作以消除噪声。
    edges_cv = cv2.Canny(res, 200, 400)
    #模糊边缘
    blurred_edges = cv2.GaussianBlur(edges_cv,(3,3),0) 
    # 只想保留这样的裂缝:邻近其他裂缝或大于某个最小阈值
    bdilation = nd.morphology.binary_dilation
    berosion = nd.morphology.binary_erosion
    edges_2 = bdilation(berosion(blurred_edges, iterations=2), iterations=2)
    defect_score = edges_2.mean()
    
    • 最终缺陷得分6.95%,是上述处理后图像中白色像素的百分比。

    • 再次说明,这些技术只是第一次迭代,并受到光或摄像机角度变化的限制。不过,它们足够测量我们在纽约市目前所见过的一些自行车道的质量。

    到现在,团队骑行超过50英里,收集了4500个街景
    • 更进一步,可以构建卷积神经网络(CNN),并用我们每个(标记的)图像训练它。

    相关文章

      网友评论

        本文标题:新手向——通过街头图像评估纽约市自行车道的质量

        本文链接:https://www.haomeiwen.com/subject/sgaxlxtx.html