【问题标题】:Region of Interest in nighttime vehicle detection夜间车辆检测的感兴趣区域
【发布时间】:2014-05-20 14:23:56
【问题描述】:

我正在开发一个在夜景中检测车辆前灯的项目。我正在 MATLAB 上进行演示。我的问题是我需要找到感兴趣的区域 (ROI) 以获得较低的计算要求。我研究了很多论文,他们只是使用像这样一个固定的ROI,上面的部分被忽略,底部用于稍后分析。

但是,如果相机不稳定,我认为这种做法是不合适的。我想找到一个更灵活的,它在每一帧中交替。我的实验图像显示在这里:

如果有人有任何想法,请给我一些建议。

【问题讨论】:

  • 如果看HSV空间的V分量呢?我猜这会给你一个起点。
  • 你的意思是我应该根据亮度?我试过但不知道如何区分 2 个区域。
  • 基本上我想丢弃上面较暗的部分,只处理图像中较低的较亮部分
  • 你还没有显示你所追求的地区。添加两个额外的图像并显示您要识别的区域。目前尚不清楚您所关注的区域,这意味着您获得有用答案的机会将更少。

标签: matlab image-processing computer-vision roi


【解决方案1】:

您可以尝试对图像进行下采样。

【讨论】:

  • 什么意思?我不明白。
  • 从您的问题中,我了解到您已经知道如何检测您想要的内容,您主要关心的是速度。如果图像帧太大,您可以将它们缩小并处理缩小的版本。但是,您必须选择不会对准确性产生不利影响的比例
  • 并且,下采样与调整大小不同。虽然我不能肯定地说,它可能比插值更快(matlab调整大小使用插值)
  • 是的,你是对的。我专注于速度,但我的目标是处理高清图像,所以我需要保持图像的相同大小
  • 如果我的建议对您不清楚,希望以下示例对您有所帮助。有时,我不得不在尺寸约为 3MP 的图像中本地化检查。我对图像进行了下采样并在其上运行了我的定位算法,提取了 ROI,将其投影到原始的 ~3MP 图像并提取了检查。然后我对从 ~3MP 图像中提取的区域进行了所需的处理(如二值化)。
【解决方案2】:

我会转过头来说我们正在寻找车头灯 ABOVE ABOVE 某条线,而不是说车头灯低于某条线,即地平线,

您的图像在停机坪上有很高的反射率,我们可以利用这一点。我们知道图像中的最大光量是在反射和前灯附近的某个地方。因此,我们寻找光线最大的那一排并将其用作我们的地板。然后寻找本层上方的前灯。

这里的想法是我们逐行查看强度分布并找到具有最大值的行。

这仅适用于黑暗图像(即夜晚)以及前灯在停机坪上的反射很大的情况。

它不适用于白天拍摄的图像。

我是用 Python 和 OpenCV 编写的,但我相信您可以将其翻译成您选择的语言。

import matplotlib.pylab as pl
import cv2

# Load the image
im = cv2.imread('headlights_at_night2.jpg')

# Convert to grey.
grey_image = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)

大幅平滑图像以掩盖任何局部高峰或低谷 我们正在尝试平滑前灯和反射,以便有一个漂亮的峰值。理想情况下,前灯和反射会合并为一个区域

grey_image = cv2.blur(grey_image, (15,15))

逐行求和

intensity_profile = []
for r in range(0, grey_image.shape[0]):
    intensity_profile.append(pl.sum(grey_image[r,:]))

平滑配置文件并将其转换为 numpy 数组以便于处理数据

window = 10
weights = pl.repeat(1.0, window)/window
profile = pl.convolve(pl.asarray(intensity_profile), weights, 'same')

找到配置文件的最大值。这表示前灯和反射区域的 y 坐标。左侧的热图显示了分布情况。右图显示每行的总强度值。

我们可以清楚地看到强度总和有一个峰值。y坐标为371,在热图中用红点表示,图中用红色虚线表示。

max_value = profile.max()
max_value_location = pl.where(profile==max_value)[0]
horizon =  max_value_location

最右边图中的蓝色曲线代表变量profile

我们找到最大值的那一行就是我们的楼层。然后我们知道大灯在这条线之上。我们还知道,图像的大部分上部将是天空,因此是黑暗的。

我在下面显示结果。 我知道两张图片中的线几乎在相同的坐标上,但我认为这只是巧合。

【讨论】:

  • 感谢您的详尽回答。它对我有很大帮助。我还有 1 个问题:你如何计算每一行的强度?您是否只是添加了一行的所有像素值?
  • 是的。你取每一行并总结每一行的强度。然后,您将获得具有 1x640 个元素的向量(如果您有 640 行)。每行一个值。
  • @Benoit_11 谢谢。我在显微镜图像上使用了这种技术来寻找细胞所在的培养皿表面。很高兴得到具有相似背景和兴趣的人的认可(包括冰球:-))。
  • @kkuilla,您能解释一下您是如何计算热图的吗? profile 和 intensity_profile 变量是向量,但热图应该来自 2D 矩阵。如何使用 max_value 和 Horizo​​n 值来获得结果图像?
  • @Vendetta 您可以从查找强度最高的行开始。一旦你知道了这一点,你就会知道灯光在图像的哪个区域,并会给你一个起点。因此,您可以循环遍历图像的每一行,从顶部到水平线并取例如每行的平均值。最高平均值将告诉您前灯可能在哪一行。您必须尝试最大值、平均值、中值等,看看是否可行。
猜你喜欢
  • 2011-08-10
  • 2012-02-22
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 2012-04-25
  • 1970-01-01
相关资源
最近更新 更多