检测车道线——4.边缘检测 Canny Edge Detection

计算机视觉指的是,能够用算法,让计算机看到我们能看到的世界,比如深度、颜色、形状和含义。我们将使用Python和OpenCV进行计算机视觉工作。 OpenCV代表开源计算机视觉。OpenCV包含您可以使用的丰富函数库。 OpenCV库有很好的文档记录,所以如果你对特定函数的参数或其他内容感到困惑,可以在opencv.org上找到大量信息。

  Canny Edge Detection,边缘检测,用于检测出图像物体的边界(boundaries)。

具体步骤:

  首先,将图像转为灰度(grayscale)。每个像素点的灰度数值在[0,255]区间,行车线的颜色通常与路面有较大差异,我们可以利用路面到行车线的颜色突变来进行检测。

     

  然后,计算梯度(gradient)。每个像素的亮度对应是该点梯度强度;通过追踪出最大梯度下的像素得到边缘。通过辨别出边沿,得到物体的形状。

  通过检测到物体边界,进而得到该物体形状。

   那边界(edge)是什么呢?

  OpenCV的Canny function 需要的参数如下:edges=cv2.Canny(gray,low_threshold,higy_threshold)

  输入灰度图,输出边界图。低阈值和高阈值用于确定要检测出的边界的强度。可以将边缘的强度大小视为由图像中相邻像素值的差异大小。就是灰度的强度。

       

  看一张灰度图像,我看到亮点,黑点和其间的所有灰色。亮度的快速变化是我们找到边缘的地方。

  我们的图像只是x和y的数学函数,所以我们可以对其进行数学运算,就像其他函数一样。

  例如,我们可以采用它的导数,它只是这个函数变化的度量。一个小的派生意味着小的变化。 大派生,很大的变化。 图像是二维的,所以同时采用关于x和y的导数是有意义的。 这被称为渐变,在计算它时,我们测量的是图像中每个点像素值的变化速度以及它们变化最快的方向。

  计算渐变给了我们厚重的边缘。 使用Canny算法,我们将精简这些边以找出最强梯度之后的各个像素。然后,我们将这些较强的边扩展到包含像素,直到调用Canny函数时定义的较低阈值。

   注意! 图像的原点(x = 0,y = 0)的标准位置在左上角,y值向下增加,x向右增加。 这看起来可能很奇怪,但如果您将图像视为矩阵,则“00”元素位于左上角是有意义的。

  我正在通过这张图片绘制横截面(cross section中灰度值变化曲线)。 图像中A到F中哪些区域最有可能被识别为边缘? 答案:A、C、E。(灰度变化最大的区域)

  步骤:

1.读取图像;

2.转化为灰度;

3.利用canny边缘检测cv2.Canny(gray, low_threshold, high_threshold),检测灰度图

该算法将首先检测high_threshold之上的强边缘(强梯度)像素,并拒绝低于low_threshold的像素。 接下来,只要连接到强边缘,包含low_threshold和high_threshold之间值的像素将被包含在内。 输出边缘是一个二值图像,其中白色像素描绘出检测到的边缘,而其他位置则为黑色。具体可见canny文档

转换为灰度已经给我们留下了8位图像,所以每个像素可以取2 ^ 8 = 256个可能的值。 因此,像素值的范围从0到255。这个范围意味着衍生物(本质上,每个像素之间的值差异)将在数十或数百的范围内。 所以,您的阈值参数的合理范围也将在几十到几百。就低阈值与高阈值的比率而言,John Canny本人推荐1:2或1:3的低到高比例。

4.在运行Canny之前,我们还将包括高斯平滑,这实际上是一种通过平均来抑制噪声和杂散梯度的方法(查看GaussianBlur的OpenCV文档)。 cv2.Canny()实际上在内部应用高斯平滑,但我们在这里包含它,因为通过应用更多的平滑可以得到不同的结果(并且它不是cv2.Canny()内的可变参数!)。您可以选择高斯平滑的kernel_size作为任何奇数。更大的kernel_size意味着在更大的区域上进行平均或平滑。

5.在这里,我称OpenCV函数Canny在一个名为blur_gray的高斯平滑灰度图像上,并检测了高阈值和低阈值梯度上的阈值。

 1  import matplotlib.pyplot as plt
 2  import matplotlib.image as mpimg
 3  import cv2  #bringing in OpenCV libraries
 4  
 5  #read in the image and convert to grayscale
 6  image = mpimg.imread('E:/spyder/a/a/exit-ramp.jpg')
 7  gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY) #grayscale conversion
 8  #define a kernel size for Gaussian smoothing/blurring
 9  #note:this step is optional as cv2.canny() applies a 5*5 Gaussian internally
10  kernel_size=3
11  blur_gray=cv2.GaussianBlur(gray,(kernel_size,kernel_size),0)
12  
13  #define parameters for canny and run it
14 #note:if you try running this code you might want to change these!
15  low_threshold=100
16  high_threshold=250
17  edges=cv2.Canny(gray,low_threshold,high_threshold)
18  
19  #display the image
20  plt.imshow(edges, cmap='Greys_r')

 

 

原文地址:https://www.cnblogs.com/minyshi/p/8573685.html