如何在视频中删除剧烈的亮度变化?

时间:2013-08-26 20:26:30

标签: matlab opencv image-processing computer-vision

我从摄像机获得了一系列图像。我发现有时来自流的图像会有很大的亮度峰值(每个像素跳跃或下降值),然后在下一张图像中返回到正常的亮度级别。

这对我的算法来说是一个很大的问题。无论如何我可以防止这种亮度上升?我在想像每个像素上的低通滤波器,但我想知道是否有人有更多这方面的经验。

我将在MATLAB中进行设计并在OpenCV中实现。如果任何一个平台都有一些漂亮的功能,我很乐意听到它们。

谢谢你的时间!

2 个答案:

答案 0 :(得分:11)

一个相当天真的解决方案是将图像转换为YUV颜色空间,在Y通道上执行直方图均衡,然后转换回RGB。该方法试图将图像的亮度归一化为每帧的相同分布,以补偿亮度的变化。

在OpenCV中执行此操作的代码是:

cv::cvtColor(img, img, CV_BGR2YUV);
std::vector<cv::Mat> channels;
cv::split(img, channels);
cv::equalizeHist(channels[0], channels[0]);
cv::merge(channels, img);
cv::cvtColor(img, img, CV_YUV2BGR);

这会产生如下所示的效果。请注意, Equalized 列中两个图像的亮度与两个原始图像的亮度更相似。你的里程会有所不同。

Luminance Equalization

答案 1 :(得分:0)

每个像素?听起来像是照明或相机问题。如果你无法控制,我只会检测坏帧并丢弃/忽略它们。无论如何,它们可能很麻烦,因为您可能有饱和或剪裁的区域。

对于检测,我首先看一下图像中不同区域的直方图的低百分位数,然后查找它们全部向上或向下跳跃的帧