删除|图像数据的特征工程( 三 )


使用灰度或者RGB的通道选择 , 就需要考虑是否要从图像中删除了重要信息 。 但是对于本文中的轨道示例 , 轨道是橙色的 , 所以没有问题 , 轨迹的颜色有助于将其与图像的其他部分区分开来 。 这也是在实际应用是需要考虑的 。
Intensity threshold
使用灰度化 , 每个像素的值将在0到255之间 。 我们可以通过将输入转换为二进制值来进一步简化输入 。 如果灰度值高于一个阈值 , 像素值为1 , 否则为0 。 我们称之为强度阈值 。
下面的函数用于应用该阈值 。 首先对图像进行灰度化(第5行) 。 如果像素高于阈值 , 那么它将被设置成1000(第8行) 。 如果像素值低于阈值将被设置为0(第9行) 。 最后还将再次缩放所有像素 , 使它们的值为0或1(第11行) 。
自动驾驶汽车项目的一部分是为了避开障碍物 。 在图7中 , 可以看到如何应用强度阈值函数 , 我们可以将这个黑色的罐头障碍物从图像中分隔离出来 。

这里的截断值可以看作是一个超参数 。 更大的截断意味着我们包含更少的背景噪声 。 但是缺点是我们捕获的范围更小 。
Edge detection
如果想分离轨道 , 可以用更精细边缘检测方法 。 这是一种用于检测图像边缘的多级算法 。
这里我们使用cv2.Canny()函数应用该算法 。 其中threshold1和threshold2为滞回过程参数 。 这是边缘检测算法的最后一个过程 , 用于确定哪些线是真正的边 。
#Apply canny edge detection
edge_img = cv2.Canny(imgthreshold1 = 50 threshold2 = 80)
就像强度阈值一样 , 我们留下了一个二进制映射-白色表示边 , 黑色表示其他 。 这条轨迹现在更容易与图像的其他部分区分开来 。 但是可以看到背景中的边缘也被检测到了 。

Colour filter
如果我们用像素颜色来隔离轨迹 , 可能会有更好的结果 。 使用下面的pixel_filter函数来做到这一点 。 cv2.inRange()将图像转换为二进制映射(第10行) 。 这个函数检查像素是否在lower(第5行)和upper(第6行)列表给出的范围内 。 具体来说 , 每个RGB通道必须在各自的范围内(例如134-t≤R≤194+t) 。
def pixel_filter(img t=0):
   
   \"\"\"Filter pixels within range\"\"\"
   
   lower = [134-t84-t55-t

   upper = [192+t121+t101+t


   img = np.array(img)
   orange_thresh = 255 - cv2.inRange(img np.array(lower) np.array(upper))

   return orange_thresh
简单来说 , 该函数确定像素颜色是否与轨道的橙色足够接近 。 可以在图9中看到结果 。 参数t引入了一些灵活性 。 使用更高的值可以捕获更多的轨道 , 但会保留更多的噪音 。 这是因为背景中的像素也会落在这个范围内 。

我们从哪里得到下界和上界呢?也就是说我们怎么知道会落在[1348455
和[192121101
之间?如果你有兴趣 , 我们将在后面的文章中解释 。
在图10中 , 可以看到正在运行的选择器 。 从多个图像中选择像素 , 并尝试在轨道上的不同位置选择它们 。 这样我们就能在不同的条件下得到完整的像素值 。

我们一共选了60种颜色 。 可以在图11中看到所有这些 。 所有这些颜色的RGB通道存储在一个列表变量-“colours”中 。

最后 , 我们为每个RGB通道取最小值和最大值 。 这就给出了下界和上界 。
lower = [min(x[0
for x in colours)
             min(x[1
for x in colours)
             min(x[2
for x in colours)


upper = [max(x[0
for x in colours)
             max(x[1