Measuring the quality of NYC Bike Lanes through street imagery
-
在另一篇文章中,我介绍了如何使用Open Street Cam(OSC)应用收集街道图像,在这片文章中,我将简单介绍我们对街道图像使用到的图像处理和计算机视觉技术。
我们也尝试过使用 微软定制视觉 产品,根据简单标记的自行车道图像,快速生成分类结果。 -
Greg Dobler教授是NYU CUSP的图像处理专家,我们咨询了他来帮助我们构建这些算法。
-
我们尝试结合四种方式来评估自行车道质量,并借鉴NACTO的“城市街道设计指南”:
- 骑行质量,使用前面提到的app记录的加速度数据测量。
- 自行车道的颜色,绿色车道相比没有涂色的车道质量更高,因为它们的可见性更好。
- 符号和路面标记,良好标记的车道质量更好。
- 可见道路缺陷,如裂缝和坑洼,越少越好。
-
以下重点是测量路面标记和可见缺陷。这是一个幼稚的评分系统,也是程序的第一次迭代(类似于许多计算机视觉应用)。
检测车道标记
- 使用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)
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%,是上述处理后图像中白色像素的百分比。
-
再次说明,这些技术只是第一次迭代,并受到光或摄像机角度变化的限制。不过,它们足够测量我们在纽约市目前所见过的一些自行车道的质量。
- 更进一步,可以构建卷积神经网络(CNN),并用我们每个(标记的)图像训练它。
网友评论