首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >opencv:执行夜视

opencv:执行夜视
EN

Stack Overflow用户
提问于 2013-07-30 03:25:56
回答 2查看 5.3K关注 0票数 5

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

EN

回答 2

Stack Overflow用户

发布于 2013-08-17 05:12:37

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

  1. 在摄影机中获得更多光子
  2. 赋予每个光子更多“权重”

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

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

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

最后一步是,正如之前在注释中建议的那样,按照here的说明应用gamma校正。Gamma校正往往会降低图像中的对比度,但由于您使用直方图均衡化提高了对比度,因此应该会获得良好的结果。

票数 2
EN

Stack Overflow用户

发布于 2013-08-17 05:56:35

正如米歇尔所指出的,试试equalizeHist吧。下面是一个最小的例子:

代码语言:javascript
复制
#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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17932532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档