C++ opencv:执行夜视

C++ opencv:执行夜视,c++,image,opencv,image-processing,computer-vision,C++,Image,Opencv,Image Processing,Computer Vision,首先,我不是说真正的夜视。我说的是在光线条件差时用来提高图片亮度/光线的技术。你可以在智能手机中完美地看到这一技术,在手机中表现出色。我知道在这里使用的技术,获得现有的光,并使用它使图片清晰。但是如何在opencv中实现这一点呢?任何一种方法或一步一步的过程?基本上有两种方法可以使你的图像变亮: 在相机中获取更多光子 给每个光子更多的“重量” 对于方法1,假设您无法控制照明,那么获得更多光子的唯一方法是将传感器暴露更长时间。这假设您可以更改相机的积分时间。这种方法的缺点是可以获得更多的运动模糊

首先,我不是说真正的夜视。我说的是在光线条件差时用来提高图片亮度/光线的技术。你可以在智能手机中完美地看到这一技术,在手机中表现出色。我知道在这里使用的技术,获得现有的光,并使用它使图片清晰。但是如何在opencv中实现这一点呢?任何一种方法或一步一步的过程?

基本上有两种方法可以使你的图像变亮:

  • 在相机中获取更多光子
  • 给每个光子更多的“重量”
  • 对于方法1,假设您无法控制照明,那么获得更多光子的唯一方法是将传感器暴露更长时间。这假设您可以更改相机的积分时间。这种方法的缺点是可以获得更多的运动模糊

    对于方法2,这相当于对输入图像应用乘法增益,这使得每个光子对结果图像贡献更多DN。应用这样的增益假设你有关于输入图像亮度的先验信息。如果你的增益值不好,你会有一个饱和或太暗的图像

    如前所述,要自动改善图像,最好的方法是使用OpenCV的equalizeHist函数。这个操作并不完全是一个乘法增益,但效果是相似的


    最后一步是,如前面评论中所建议的,应用所述的伽马校正。Gamma校正往往会降低图像的对比度,但由于使用直方图均衡化改进了对比度,因此应该会得到很好的效果。

    正如Michel指出的那样,尝试使用均衡器。 下面是一个简单的例子:

    #include <opencv2/opencv.hpp>
    
    using namespace cv;
    
    
    int main(int argc, char *argv[])
    {
        namedWindow("input");
        namedWindow("output");
        Mat in = imread("yourDarkImage.jpg");;
        Mat out;
    
        if(in.empty())exit(1);
    
        //equalize histograms per channel
        vector<Mat> colors;
        split(in, colors);
        equalizeHist(colors[0], colors[0]);
        equalizeHist(colors[1], colors[1]);
        equalizeHist(colors[2], colors[2]);
        merge(colors, out);
    
        imshow("input", in);
        imshow("output", out);
    
    
        waitKey(0);
        return 0;
    }
    
    #包括
    使用名称空间cv;
    int main(int argc,char*argv[])
    {
    名称(“输入”);
    名称(“输出”);
    Mat in=imread(“yourDarkImage.jpg”);;
    垫出;
    如果(in.empty())退出(1);
    //均衡每个通道的直方图
    矢量颜色;
    分裂(在,颜色);
    均衡器(颜色[0],颜色[0]);
    均衡器(颜色[1],颜色[1]);
    均衡器(颜色[2],颜色[2]);
    合并(颜色,输出);
    imshow(“输入”,in);
    imshow(“输出”,out);
    等待键(0);
    返回0;
    }
    
    查看伽马校正,但通常情况下,您需要与相机交互以获得自动增益控制(AGC)(我还建议自动曝光控制,如果您能够成功的话)。这取决于硬件。即使在智能手机中,“假”夜视也是通过切换NIR阻挡过滤器来实现的。您可以通过拍摄按下遥控器的照片来验证这一点。因此,据我所知,除了使用OpenCV调整图像的gamma或亮度外,没有其他方法可以模拟夜视。在gamma校正之前,您需要清理图像:去除偏差并进行轻微的中值滤波。否则您的图像将非常嘈杂。您可以在HSV颜色空间中做得更好,并且只均衡Y(lum)通道。或者,只需对黑白图像执行此操作。均衡每个颜色通道将产生奇数(pyschodelic)颜色效果哇!我需要试试这个!在我的项目完成之前,我是否可以就这些问题亲自联系你???哇!这种方法似乎非常酷和先进!在我的项目完成之前,我是否可以就这些问题亲自联系你???