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

Measuring the quality of NYC Bike Lanes through street imagery

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

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

  • 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)
新手向——通过街头图像评估纽约市自行车道的质量_第1张图片
  • 接着使用高斯模糊,带宽值为40像素
# 使用高斯滤波模糊白色区块
gf = nd.filters.gaussian_filter
blurPhoto = gf(1.0 * wind, 40)

plti(blurPhoto)
新手向——通过街头图像评估纽约市自行车道的质量_第2张图片
  • 再次设定阈值,0、1二值图像
# 阈值位于黑白之间的灰色区域
# 像素值大于阈值为1,小于为0
threshold = 0.16
wreg = blurPhoto > threshold

plti(wreg)
新手向——通过街头图像评估纽约市自行车道的质量_第3张图片

于是得到该车道标记的最终得分:在最后一张图中白色区域(即车道标记)的占比(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)
新手向——通过街头图像评估纽约市自行车道的质量_第4张图片
  • 边缘检测,使用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()
新手向——通过街头图像评估纽约市自行车道的质量_第5张图片
  • 最终缺陷得分6.95%,是上述处理后图像中白色像素的百分比。

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

新手向——通过街头图像评估纽约市自行车道的质量_第6张图片
到现在,团队骑行超过50英里,收集了4500个街景
  • 更进一步,可以构建卷积神经网络(CNN),并用我们每个(标记的)图像训练它。

你可能感兴趣的:(新手向——通过街头图像评估纽约市自行车道的质量)