首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >径向过度曝光修复梯度OpenCV

径向过度曝光修复梯度OpenCV
EN

Stack Overflow用户
提问于 2018-01-10 02:05:44
回答 1查看 547关注 0票数 0

我有一台照相机和一盏灯。相机是自动拍照的,灯是刚性的。

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

有没有一种简单的方法来使中间变暗,或使外部变亮以适应这一点(最好是用渐变)?

我正在使用带有C++应用程序接口的OpenCV。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-01-10 02:45:30

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

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

因此,您有一个要操作的图像转换,我假设它包含CV_32F类型的数据(如果不是浮点型或双值,则cv::Mat img;可以是多个通道)。您可以创建另一个cv::Mat

代码语言:javascript
复制
//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);

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48174237

复制
相关文章

相似问题

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