opencv上Gamma调节的源码

举报
ShaderJoy 发表于 2021/12/30 01:13:06 2021/12/30
【摘要】 这周单位要做一个人脸美化的项目,查资料遇到这位大牛的博客,地址如下:点击打开链接 我的代码也是在他的基础上进行修改的,但是他对图像的RGB三个通道平等调节,为了适应我的需求,我改成了针对三个通道分别调节。废话不多说,开始上源码 void ImageAdjust(Mat& src, Mat& dst, ve...

这周单位要做一个人脸美化的项目,查资料遇到这位大牛的博客,地址如下:点击打开链接

我的代码也是在他的基础上进行修改的,但是他对图像的RGB三个通道平等调节,为了适应我的需求,我改成了针对三个通道分别调节。废话不多说,开始上源码


  
  1. void ImageAdjust(Mat& src, Mat& dst,
  2. vector<double> low_in,
  3. vector<double> high_in,
  4. vector<double> low_out,
  5. vector<double> high_out,
  6. vector<double> gamma)
  7. {
  8. vector<double> low;
  9. vector<double> high;
  10. vector<double> bottom;
  11. vector<double> top;
  12. vector<double> err_in;
  13. vector<double> err_out;
  14. int N = low_in.size();
  15. for (int i=0; i<N; i++)
  16. {
  17. low.push_back(low_in[i]*255);
  18. high.push_back(high_in[i]*255);
  19. bottom.push_back(low_out[i]*255);
  20. top.push_back(high_out[i]*255);
  21. err_in.push_back(high[i] - low[i]);
  22. err_out.push_back(top[i] - bottom[i]);
  23. }
  24. int x,y;
  25. vector<double> val;
  26. // intensity transform
  27. for( y = 0; y < src.rows; y++)
  28. {
  29. for (x = 0; x < src.cols; x++)
  30. {
  31. for (int i=0; i<N; i++)
  32. {
  33. double val = (src.at<Vec3b>(y, x)[i]);
  34. val = pow((val-low[i])/err_in[i], gamma[i])*err_out[i]+bottom[i]; // ☆
  35. if(val > 255)
  36. val = 255;
  37. if(val < 0)
  38. val = 0;
  39. dst.at<Vec3b>(y, x)[i] = val;
  40. }
  41. }
  42. }
  43. }

测试主函数:


  
  1. int _tmain(int argc, _TCHAR* argv[])
  2. {
  3. Mat src = imread("test.png",1);
  4. Mat dst = Mat(src.size(), src.type());
  5. if (!src.empty())
  6. {
  7. double a[] = {0.0, 0.0, 0.0};
  8. double b[] = {1.0, 1.0, 1.0};
  9. double c[] = {0.0, 0.0, 0.0};
  10. double d[] = {1.0, 1.0, 1.0};
  11. double e[] = {1.0, 1.0, 1.0};
  12. vector<double> low_in(a, a+3);
  13. vector<double> high_in(b, b+3);
  14. vector<double> low_out(c, c+3);
  15. vector<double> high_out(d, d+3);
  16. vector<double> gamma(e, e+3);
  17. ImageAdjust(src, dst,
  18. low_in,
  19. high_in,
  20. low_out,
  21. high_out,
  22. gamma
  23. );
  24. imshow("src", src);
  25. imshow("dst", dst);
  26. waitKey(0);
  27. }
  28. return 0;
  29. }

注意:☆处是将图像I中的亮度值映射为一个新值,即将low_in至high_in之间的值映射到low_out至high_out之间的值。low_in 以下与 high_in 以上的值被截断了,其中 gamma指定描述值I和值J关系曲线的形状如果gamma小于1,此映射偏重更高数值(明亮)输出,如果gamma大于1,此映射偏重更低数值(灰暗)输出,如果省略此参数,默认为(线性映射)。 具体用法可以参考matlab中的imadjust。




文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/26726241

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。