首先,我不是在谈论真正的夜视。我说的是在光线条件差时用于提高图片亮度/光线的技术。您可以在智能手机中完美地看到这种技术,在平板手机中表现出色。我知道这里使用的技术,获取现有的光线并用它来使图片清晰。但是如何在opencv中做到这一点?有什么方法或一步一步的过程吗?
问问题
5541 次
2 回答
2
基本上有两种方法可以使图像变亮:
- 在相机中获取更多光子
- 给每个光子更多的“重量”
对于方法1,假设您无法控制照明,那么获得更多光子的唯一方法是让您的传感器暴露更长的时间。假设您可以更改相机的集成时间。这种方法的缺点是您可以获得更多的运动模糊。
对于方法 2,这相当于对输入图像应用乘法增益,这使得每个光子对结果图像贡献更多的 DN。不过,应用这样的增益假设您有关于输入图像亮度的先验信息。如果您的增益值不好,您将获得一个饱和或太暗的图像。
要自动改善图像,最好的方法是使用 OpenCV 的 equalizeHist 函数,如此处所述。该操作并不完全是乘法增益,但效果相似。
如先前在评论中建议的那样,最后一步是应用此处描述的伽马校正。Gamma 校正往往会降低图像的对比度,但由于您使用直方图均衡化提高了对比度,因此您应该会得到很好的结果。
于 2013-08-16T21:12:36.533 回答
1
正如 Michel 指出的那样,尝试 equalizeHist。这是一个最小的例子:
#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;
}
于 2013-08-16T21:56:35.337 回答