Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何消除视频中亮度的剧烈变化?_Matlab_Opencv_Image Processing_Computer Vision - Fatal编程技术网

Matlab 如何消除视频中亮度的剧烈变化?

Matlab 如何消除视频中亮度的剧烈变化?,matlab,opencv,image-processing,computer-vision,Matlab,Opencv,Image Processing,Computer Vision,我有一个从摄像机上获取的图像流。我发现,有时流中的图像会有一个较大的亮度峰值(每个像素的值都会跳变或下降),然后在下一幅图像中恢复到正常的亮度水平 这对我的算法来说是个大问题。有没有什么方法可以防止亮度骤增?我想在每个像素上设置一个低通滤波器,但我想知道是否有人对这个问题有更多的经验 我将在MATLAB中设计,并在OpenCV中实现。如果任何一个平台都有一些漂亮的功能,我很想听听 谢谢你的时间 一个相当简单的解决方案是将图像转换为YUV颜色空间,在Y通道上执行直方图均衡化,然后再转换回RGB。该

我有一个从摄像机上获取的图像流。我发现,有时流中的图像会有一个较大的亮度峰值(每个像素的值都会跳变或下降),然后在下一幅图像中恢复到正常的亮度水平

这对我的算法来说是个大问题。有没有什么方法可以防止亮度骤增?我想在每个像素上设置一个低通滤波器,但我想知道是否有人对这个问题有更多的经验

我将在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);
cv::cvtColor(img,img,cv_BGR2YUV);
矢量信道;
cv::分割(img,通道);
cv::equalizeHist(通道[0],通道[0]);
cv::合并(通道、img);
cv::CVT颜色(img、img、cv_YUV2BGR);
这将产生如下所示的效果。请注意,均衡列中的两个图像的亮度比两个原始图像的亮度更相似。你的里程数会有所不同


每个像素?听起来像是灯光或相机的问题。如果两者都无法控制,我只会检测坏帧并删除/忽略它们。不管怎么说,它们很可能是麻烦,因为你可能有饱和或修剪的区域


对于检测,我只需从查看图像中不同区域中直方图的低百分位开始,并查找它们都向上或向下跳跃的帧

您的相机可能具有自动对焦功能,或者根据亮度条件自动调整曝光(亮度)级别。尝试控制/禁用相机本身的某些功能。