径向过度曝光修复Gradiant OpenCV

时间:2018-01-09 18:05:44

标签: c++ opencv

我有一台相机和一盏灯。 相机自动拍照,灯泡很硬。

我的每张照片中间都有一个亮点,外面变暗(线性)。

是否有一种简单的方法可以使中间变暗,或者使外部变亮以适应这种情况(最好使用渐变)?

我正在使用OpenCV和C ++ API。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果没有例子,很难说你想做什么。但是,我们假设所有图像中的效果完全相同,并且您希望对每个图像应用相同的变换。

你说效果是线性的,假设你想让中心变暗20%,距中心最远的像素变亮20%。让我们进一步假设光学中心位于图像的中心(实际上不一定是真的)。​​

所以你有一个想要操作的图像cv::Mat img;,我认为它包含CV_32F类型的数据(如果不是浮点数或双值,转换,可以是多个通道)。你创建了另一个cv :: Mat

//first, make a mask image to multiply the image with
cv::Mat mask = cv::Mat::zeros(img.rows,img.cols,CV_32F);

float maxdist = std::sqrt(img.rows*img.rows+img.cols*img.cols)/2;

cv::Point2f center(img.cols*0.5,img.rows*0.5);

for (int j=0;j<img.rows;++j)
    for (int i=0;i<img.cols;++i)
    {
         cv::Point2f p(i,j);
         cv::Point2f diff(p-center);
         float dist(std::sqrt(diff.dot(diff)));
         float factor(0.8+0.4*dist/maxdist);
         mask.at<float>(j,i) = factor;
    }

//apply the transformation, to as many images as you like
img = img.mul(mask);

这不会检查溢出,您可能会或可能不会想要这样做。但是从你的问题来看,这将是一种简单的方法。