opencv:表演夜视

时间:2013-07-29 19:25:56

标签: c++ image opencv image-processing computer-vision

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

2 个答案:

答案 0 :(得分:2)

基本上有两种方法可以照亮你的形象:

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

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

    要自动改善图像,最好的方法是使用OpenCV的equalizeHist函数,如here所述。该操作不是乘法增益,但效果类似。

    如前所述,最后一步是应用here所述的伽玛校正。伽玛校正倾向于降低图像中的对比度,但由于您使用直方图均衡来改善对比度,因此您应该获得良好的效果。

答案 1 :(得分:1)

正如米歇尔所指出的那样尝试均衡希望。 这是一个最小的例子:

#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;
}