编译:ronghuaiyang
导读
捕捉和诠释光的旅程。
从硬件到实现打算机视觉的系统,本文的概述侧重于广度而非深度。为了平衡这种方法,本文勾引读者阅读具有辅导性的参考文献,并供应了随时可以运行的源代码。我们从图像形成的机制开始。我们涵盖针孔、透镜、传感器(CCD和CMOS)、Bayer滤波器和颜色重修。
然后,我们转到打算机视觉的运用上来,检测图像中的车道线。该方法是基于一套常用的打算机视觉算法。我们涵盖了Canny边缘检测,高斯模糊,感兴趣区域,和霍夫变换。
成像历史简介拍照便是把3D场景投影到2D平面上。暗箱通过一个针孔实现了这种投影。墙上的一个小针孔让光芒穿透了阴郁的摄影机室。这个大略的机制产生了尖锐的投影,使艺术家能够在场景的细节上画出草图。但是这种方法缺少亮度,针孔本身不能网络足够的光。
柯歇(Athanasius Kircher) 1645年的著作《大路西与阴影》(Ars Magna Lucis Et Umbrae)中“便携式”暗箱的雕刻
针孔相机纵然在本日也吸引了广泛的兴趣,它们能够捕捉到令人惊叹的图像,其特点是在任何地方都能利用。缺陷还是一样,图像很暗,须要很长的曝光韶光。
用针孔相机拍摄的邓卢斯城堡的日落,曝光韶光20分钟,伊万·麦格雷戈
为理解决光芒暗淡的问题,引入了透镜。通过在光圈前放置透镜,可以聚拢更多的光。透镜还可以修正投影图像的放大倍率。在过去,放大须要艺术家移动全体相机。如今,在不改变场景和像面之间的间隔的情形下,可以通过移动镜头的位置来调节放大效果。变焦是移动镜头来改变放大倍率的过程。
纵然有了镜头,捕捉图像也须要很永劫光依赖艺术家在投影图像上作画。19世纪30年代,路易斯·达盖尔(Louis Daguerre)发明了胶片,这是拍照史上最主要的发明之一。这是第一次有可能在物理层上记录光,不须要依赖艺术家,只须要按下一个按钮,就能记住一个时候。
胶片上涂上卤化银。一旦暴露在光芒下,卤化银就会转化为金属银。转换量取决于胶片上任何特定点的曝光量。为了产生图像,胶片随后要经由化学显影处理。
黑白底片处理
硅成像探测器的发明乃至比胶片的影响更大。同样的芯片可以用来捕捉无限多的图片,而不再须要化学摄影显影。它是数码相机所利用的技能,也是我们大多数人本日随身携带的手机。
图像传感器概括地说,拍照便是将3D场景投影到2D平面上。投影是通过光圈来实现的,通过透镜来网络更多的光芒并调节放大倍率。2D平面最初是一个大略的平面,艺术家可以在上面作画。后来它变成了卤化银薄膜的表面。末了是硅芯片的表面:图像传感器。
为了将吸收到的光转换成数字图像,大多数图像传感器依赖于硅原子的特性。当一个具有足够能量的光子撞击硅原子时,它会开释出电子。在硅晶格(一个像素)上,光子通量暴露产生电子通量。然后电子通量被转换成电压。
电荷耦合装置 CCD在这种类型的图像传感器中,光子到电子的转换发生在每个像素中。在每个像素下都有一个电容储存开释的电子。一个叫做“垂直CCD移位寄存器”的电路连接每列像素的电容。这个电路可以使电子从一个像素垂直转移到它正下方的像素上,直到它们到达末了一行。末了一行由水平CCD移位寄存器连接,该寄存器将电子送到模数转换器中。
CCD中电子的垂直通报采取bucket-brigade法完成。这意味着每一行在获取其前面一行的电子之前,先将其电子通报给下一行。水平转移保持行顺序,当它们水平移动到ADC时,它们被转换为与它们的电子电荷成比例的电压。
互补金属氧化物半导体 CMOSCMOS以不同的办法实现图像传感器。它不是将电子从像素转移到ADC,而是集成了像素级的电压转换。
利用CMOS可以单独寻址每个像素以读取其电压。这供应了更多的灵巧性,由于它可以加快特定兴趣区域的阅读速率。这种灵巧性因此更小的光敏区域为代价的,由于在像素级集成了更多的组件。为了填补感光区域的减少,微透镜被直接放置在每个像素的上方。这些微透镜将光芒聚焦在光敏探测器上。
像素构造
获取颜色像素本身能够捕捉光的强度,但不能捕捉光的波长。为了捕捉颜色(波长),最盛行的方法是叠加一个拜耳滤光片阵列。在这种方法中,每个像素都被一个赤色、绿色或蓝色的滤光片覆盖。
图像传感器的像素阵列上的彩色滤光片的拜耳排列。每个2乘2单元格包含两个绿色,一个蓝色和一个赤色的滤光片。
人类对险些所有颜色的觉得都可以通过3种波长产生。捕捉赤色、绿色和蓝色的波长就足以重现拍摄到的场景的实际颜色。但就其本身而言,拜耳模式的叠加是不足的。它产生的图像看起来像左边的:
左边图像的像素要么是赤色,要么是绿色,要么是蓝色。把稳,图像看起来大部分是绿色的。拜耳模式仿照了人类视网膜在白天对绿光最敏感的事实。因此滤镜是一半绿色,四分之一赤色,四分之一蓝色。
为了将左边的图像转换为右边的图像,我们取每个像素的值,并将其与相邻像素的值结合起来。这个过程被称为插值。假设我们从左边的图片中取一个蓝色的像素。插值是将蓝色值与相邻像素的赤色和绿色值稠浊在一起。
打算机视觉图像传感器的运用已经成为我们生活中的基本组成部分。它们塑造了我们表达自我和互换的办法,它们开辟了科学和艺术的跨学科领域。大概这些领域中最前辈的是打算机视觉。
研究打算机视觉必须从欣赏使之成为可能的硬件开始。我们已经简要地理解了硬件的历史、进展和紧张组件。让我们来看一个利用它的令人愉快的实际运用。
自动驾驶中的车道线检测从2021年5月开始,特斯拉开始交付不再安装雷达的Model 3和Model Y。这些车型依赖基于摄像头的自动驾驶系统,以相同的安全评级供应相同的功能。
特斯拉Vision的主动安全功能之一是车道偏离警告/避免。能够探测道路车道在驾驶中是至关主要的。我们将研究车道检测,并以两种不同的办法实现它。首先利用打算机视觉算法,其次利用空间卷积神经网络。

第一步是检测图像中最显著的边缘。与其相邻像素亮度比拟较大的区域被标记为边缘。下面的代码将图像转换为灰度,用高斯滤波器进行模糊以减少噪声,并运用算法Canny边缘检测。
def canny(image): gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) blur = cv2.GaussianBlur(gray, (5, 5), 0) canny = cv2.Canny(blur, 10, 30) return canny
Canny Edge Detection

经由Canny边缘检测后得到的图像
这些图像充满了我们不须要的信息。我们想专注于前方的道路,以是我们将定义一个多边形区域,以裁剪每个图像。定义多边形的点对这两幅图像来说是不同的。为了找到它们,我们可以绘制图像并显示宽度和高度轴。
def region_of_interest(image): height = image.shape[0] width = image.shape[1] polygons = np.array([[(10,height), (width,height), (width,1100), (630, 670), (10, 1070)]]) mask = np.zeros_like(image) cv2.fillPoly(mask, polygons, 255) masked_image = cv2.bitwise_and(image, mask) return masked_image
用于裁剪图像的多边形掩码
感兴趣区域掩码的结果
不雅观察产生的感兴趣区域,人眼可以很随意马虎地感知线条。这些线实际上是一系列像素,它们只是打算机中的点。我们须要追踪两条最能描述点排列的主线。这是利用Hough变换算法完成的。
lines = cv2.HoughLinesP(cropped_image, 2, np.pi/180, 100, np.array([]), minLineLength=40, maxLineGap=5)

在原始图上加上蓝色线条的结果
这种方法彷佛产生了很好的结果,但这种实现远非最佳,由于:
我们必须明确定义每个情形的兴趣区域。由于透视的变革,运用相同的多边形掩码来裁剪ROI是不可能的。打算韶光过慢,开车须要较高的处理速率。转弯包括波折的车道,这种方法只包括直线。—END—
英文原文:https://towardsdatascience.com/computer-vision-sensors-systems-bdc079847316