我会转过头来说我们正在寻找车头灯
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
我们找到最大值的那一行就是我们的楼层。然后我们知道大灯在这条线之上。我们还知道,图像的大部分上部将是天空,因此是黑暗的。
我在下面显示结果。
我知道两张图片中的线几乎在相同的坐标上,但我认为这只是巧合。