opencv上Gamma调节的源码

简介: opencv上Gamma调节的源码

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

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

void ImageAdjust(Mat& src, Mat& dst,
         vector<double> low_in,
         vector<double> high_in,
         vector<double> low_out,
         vector<double> high_out,
         vector<double> gamma)
{
  vector<double> low;
  vector<double> high;
  vector<double> bottom;
  vector<double> top;
  vector<double> err_in;
  vector<double> err_out;
  int N = low_in.size();
  for (int i=0; i<N; i++)
  {
    low.push_back(low_in[i]*255);
    high.push_back(high_in[i]*255);
    bottom.push_back(low_out[i]*255);
    top.push_back(high_out[i]*255);
    err_in.push_back(high[i] - low[i]);
    err_out.push_back(top[i] - bottom[i]);
  }
    int x,y;
  vector<double> val;
    // intensity transform
    for( y = 0; y < src.rows; y++)
    {
        for (x = 0; x < src.cols; x++)
        {
            for (int i=0; i<N; i++)
            {
        double val = (src.at<Vec3b>(y, x)[i]);
        val = pow((val-low[i])/err_in[i], gamma[i])*err_out[i]+bottom[i]; // ☆
        if(val > 255) 
          val = 255;
        if(val < 0) 
          val = 0;
        dst.at<Vec3b>(y, x)[i] = val;
            }
        }
    }
}

测试主函数:

int _tmain(int argc, _TCHAR* argv[])
{
  Mat src = imread("test.png",1);
  Mat dst = Mat(src.size(), src.type());
  if (!src.empty())
  {
    double a[] = {0.0, 0.0, 0.0};
    double b[] = {1.0, 1.0, 1.0};
    double c[] = {0.0, 0.0, 0.0};
    double d[] = {1.0, 1.0, 1.0};
    double e[] = {1.0, 1.0, 1.0};
    vector<double> low_in(a, a+3);
    vector<double> high_in(b, b+3);
    vector<double> low_out(c, c+3);
    vector<double> high_out(d, d+3);
    vector<double> gamma(e, e+3);
    ImageAdjust(src, dst, 
      low_in, 
      high_in, 
      low_out, 
      high_out, 
      gamma
      );
    imshow("src", src);
    imshow("dst", dst);
    waitKey(0);
  }
    return 0;
}

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


经过修改输入的参数,程序可以跑出来以下的效果:


image.png

image.png

image.png

目录
相关文章
|
算法 API 计算机视觉
[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)
[opencv学习笔记] jiazhigang 30讲源码C++版本(含Makefile)
271 0
|
算法 计算机视觉 开发者
OpenCV中使用Eigenfaces人脸识别器识别人脸实战(附Python源码)
OpenCV中使用Eigenfaces人脸识别器识别人脸实战(附Python源码)
694 0
|
机器学习/深度学习 监控 算法
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
基于计算机视觉(opencv)的运动计数(运动辅助)系统-源码+注释+报告
395 3
|
10月前
|
机器学习/深度学习 IDE 开发工具
基于OpenCV的车牌识别系统源码分享
基于OpenCV的车牌识别系统主要利用图像边缘和车牌颜色定位车牌,再利用OpenCV的SVM识别具体字符,从而达到车牌识别的效果。
409 4
基于OpenCV的车牌识别系统源码分享
|
11月前
|
Ubuntu 计算机视觉 C++
Ubuntu系统下编译OpenCV4.8源码
通过上述步骤,你可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使你能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
335 43
|
11月前
|
Ubuntu 计算机视觉 C++
Ubuntu系统下编译OpenCV4.8源码
通过上述步骤,你可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使你能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
291 30
|
11月前
|
Ubuntu 计算机视觉 C++
Ubuntu系统下编译OpenCV4.8源码
通过上述步骤,你可以在Ubuntu系统上成功编译并安装OpenCV 4.8。这种方法不仅使你能够定制OpenCV的功能,还可以优化性能以满足特定需求。确保按照每一步进行操作,以避免常见的编译问题。
156 12
|
缓存 并行计算 Ubuntu
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
本文是关于在Jetson AGX Xavier上编译FFmpeg(3.4.1)和OpenCV(3.4.0)的详细教程,包括编译需求、步骤、测试和可能遇到的问题及其解决方案。还提供了Jetson AGX Xavier编译CUDA版本的OpenCV 4.5.0的相关信息。
457 4
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
884 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
Ubuntu 编译器 计算机视觉
Ubuntu系统编译OpenCV4.8源码
【10月更文挑战第17天】只要三步即可搞定,第一步是下载指定版本的源码包;第二步是安装OpenCV4.8编译需要的编译器与第三方库支持;第三步就是编译OpenCV源码包生成安装文件并安装。
206 4