opencv:进行夜视

opencv: performing night vision

本文关键字:opencv      更新时间:2023-10-16

首先,我不是在谈论真正的夜视。我说的是在光线条件较差时用于提高图片亮度/光线的技术。你可以在智能手机上完美地看到这项技术,在平板电脑上也非常出色。我知道这里使用的技术,获得现有的光线,并用它来使图片清晰。但是如何在opencv中做到这一点呢?有什么方法或循序渐进的过程吗?

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

  1. 在相机中获取更多光子
  2. 给每个光子更多的"重量"

对于方法1,假设你无法控制照明,那么获得更多光子的唯一方法就是让你的传感器暴露更长的时间。假设您可以更改相机的积分时间。这种方法的缺点是可以获得更多的运动模糊。

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

要自动改善您的图像,最好的方法是使用OpenCV的equalizeHist函数,如下所述。该运算并不完全是乘法增益,但效果相似。

最后一步是,正如之前在评论中所建议的那样,应用此处所述的伽马校正。Gamma校正往往会降低图像的对比度,但由于您使用直方图均衡来提高对比度,因此应该会获得良好的结果。

正如Michel所指出的,尝试均衡Hist。这里有一个最小的例子:
#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;
}