我有一个从摄像机获取的图像流。我发现有时来自流的图像的亮度会出现很大的峰值(每个像素的值都会跳跃或下降),然后在下一张图像中恢复到正常的亮度水平。
这对我的算法来说是个大问题。无论如何我可以防止这种亮度峰值吗?我在想每个像素上的低通滤波器之类的东西,但我想知道是否有人对这个问题有更多的经验。
我将在 MATLAB 中进行设计并在 OpenCV 中实现。如果任何一个平台都有一些漂亮的功能,我很想听听它们。
谢谢你的时间!
我有一个从摄像机获取的图像流。我发现有时来自流的图像的亮度会出现很大的峰值(每个像素的值都会跳跃或下降),然后在下一张图像中恢复到正常的亮度水平。
这对我的算法来说是个大问题。无论如何我可以防止这种亮度峰值吗?我在想每个像素上的低通滤波器之类的东西,但我想知道是否有人对这个问题有更多的经验。
我将在 MATLAB 中进行设计并在 OpenCV 中实现。如果任何一个平台都有一些漂亮的功能,我很想听听它们。
谢谢你的时间!
一个相当幼稚的解决方案是将图像转换为 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);
这会产生如下所示的效果。请注意,均衡列中的两个图像的亮度比两个原始图像的亮度更相似。您的里程会有所不同。
每个像素?听起来像是照明或相机问题。如果你不能控制任何一个,我只会检测坏帧并丢弃/忽略它们。无论如何,它们可能很麻烦,因为您可能有饱和或剪裁的区域。
对于检测,我首先查看图像中不同区域的直方图的低百分位数,然后寻找它们都向上或向下跳跃的帧