Gamma校正(C++、OpenCV实现

1.作用:

Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系:

伽玛校正由以下幂律表达式定义:

2.函数原型

void calcHist( const Mat* images, int nimages,const int* channels, InputArray mask,OutputArray hist, int dims, const int* histSize,const float** ranges, bool uniform=true, bool accumulate=false );
//1.输入的图像数组   2.输入数组的个数             3.通道数              4.掩码                5.直方图
//6.直方图维度       7.直方图每个维度的尺寸数组   8.每一维数组的范围    9.直方图是否是均匀   10.累加标志

参数详解:

 images:输入的图像的指针,可以是多幅图像,所有的图像必须有同样的深度(CV_8U or CV_32F)。同时一副图像可以有多个channes。

nimages:输入图像的个数

 channels:需要统计直方图的第几通道。用来计算直方图的channes的数组。比如输入是2副图像,第一副图像有0,1,2共三个channel,第二幅图像只有0一个channel,那么输入就一共有4个channes,如果int channels[3] = {3, 2, 0},那么就表示是使用第二副图像的第一个通道和第一副图像的第2和第0个通道来计算直方图。

3.实现:

void GetGammaCorrection(Mat& src, Mat& dst, const float fGamma)
{unsigned char bin[256];for (int i = 0; i < 256; ++i){bin[i] = saturate_cast<uchar>(pow((float)(i / 255.0), fGamma) * 255.0f);}dst = src.clone();const int channels = dst.channels();switch (channels){case 1:{MatIterator_<uchar> it, end;for (it = dst.begin<uchar>(), end = dst.end<uchar>(); it != end; it++)*it = bin[(*it)];break;}case 3:{MatIterator_<Vec3b> it, end;for (it = dst.begin<Vec3b>(), end = dst.end<Vec3b>(); it != end; it++){(*it)[0] = bin[((*it)[0])];(*it)[1] = bin[((*it)[1])];(*it)[2] = bin[((*it)[2])];}break;}}
}int main()
{Mat image = imread("C:\\Users\\Administrator\\Desktop\\ir\\2ir.bmp");if (image.empty()){cout << "Error: Could not load image" << endl;return 0;}Mat dst;float fGamma = 1 / 2.0;GetGammaCorrection(image, dst, fGamma);imshow("Source Image", image);imshow("Dst", dst);  std::string filename = "C:\\Users\\Administrator\\Desktop\\ir\\dst2ir.bmp";cv::imwrite(filename, dst);cv::waitKey(0);return 0;
}
void GetGammaCorrection(Mat& src, Mat& dst, const float fGamma)
{unsigned char bin[256] = {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11,22, 23, 24, 24, 25, 26, 26, 27, 28, 29, 29, 30, 31, 32, 32, 33, 34, 35, 35, 36, 37, 38, 39, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47,64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 96, 97,118, 119, 120, 122, 123, 124, 125,  126,  127,  129,  130,  131,  132,  133,  135,  136,  137,  138,  140,  141, 142,  143,  144,  146,  147,  148,  149,  151,  152,  153,  155,  156,  157,182,  183,  185,  186,  187,  189,  190,  191,  193,  194,  196,  197,  198,  200,  201,  202,  204,  205,  207,  208,  209,  211,  212,  214,  215,  217,  218,  219,  221,  222,  224,  225,  227,11,   12,   12 ,  13,   14,   14,   15,   15,   16,   17,  17,   18,   18,   19,   20,   20,   21,   22,48,   49,   49,   50,   51,   52,   53,   54,   55,   56,   57,   57,   58 ,  59,   60,   61,   62,   63,98,   99,  100,  101,  102,  103,  104,  105,  107,  108,  109,  110,  111,  112,  113,  115,  116,  117,158,  160,  161,  162,  164,  165,  166,  167,  169,  170,  171,  173,  174,  175,  177,  178,  179,  181,228,  229,  231,  232,  234,  235,  237,  238,  240,  241,  243 , 244,  246,  247,  249,  250,  252 , 253};dst = src.clone();uchar* ptr = dst.ptr<uchar>(0);for (int i = 0; i < 400 * 640; ++i){ptr[i] = bin[ptr[i]];}
}int main()
{Mat src = imread("C:\\Users\\Administrator\\Desktop\\ir\\ir8_3.bmp", IMREAD_UNCHANGED);std::cout<< src.channels()<< std::endl;if (src.empty()){cout << "Error: Could not load image" << endl;return 0;}Mat gamma_dst;clock_t start_time, end_time;float fGamma = 1 / 1.5;start_time = clock();for (int i = 0; i < 100; ++i) {GetGammaCorrection(src, gamma_dst, fGamma);      }end_time = clock();double duration = (double)(end_time - start_time) / CLOCKS_PER_SEC;std::cout << "duration = " << duration*1000<< std::endl;imshow("Dst", src);std::string filename = "C:\\Users\\Administrator\\Desktop\\ir\\gamma_ir8_3.bmp";cv::imwrite(filename, src);cv::waitKey(0);return 0;
}

4.效果

未经gamma校正和经过gamma校正保存图像信息如图:

能够观察到,未经gamma校正的情况下,低灰度时,有较大范围的灰度值被保存成同一个值,造成信息丢失;同一时候高灰度值时,非常多比較接近的灰度值却被保存成不同的值,造成空间浪费。经过gamma校正后,改善了存储的有效性和效率。

5.原理

6.参考

【1】 http://www.cambridgeincolour.com/tutorials/gamma-correction.htm

【2】http://en.wikipedia.org/wiki/Gamma_correction

OpenCV 【十】——Gamma校正 ——图像灰度变化相关推荐

  1. gamma校正 matlab,Gamma校正 ——图像灰度变化 OpenCV (十)

    Gamma校正(C++.OpenCV实现) 1.作用: Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系: 伽玛校正由以下幂律表达式定义: 2.函数原型 v ...

  2. OpenCV 【十四】改变图像的对比度和亮度高度关联章节:OpenCV 【十】——Gamma校正 ——图像灰度变化

    目录 0 提问 1.1 原理 trick: 1.2 代码 1.3 结果 0 提问 访问像素值 用0初始化矩阵 saturate_cast 是做什么用的,以及它为什么有用 1.1 原理 图像处理 一般来 ...

  3. 图像灰度变化(OpenCV)

    图像灰度变化的原理: 彩色图像中的每个像素的颜色由R.G.B三个分量决定,而每个分量的取值范围为0~255.而灰度图像是R.G.B三个分量相同的一种特殊的彩色图像,其算法有以下两种: 1)求出每个像素 ...

  4. 基于OpenCV的Gamma校正原理与实现

    声明:本文原文出自@零钱币 的博文,原文地址为:https://blog.csdn.net/linqianbi/article/details/78617615.本文全文摘抄以及少量修订仅为本人学习. ...

  5. opencv:Gamma校正

    // 链接 https://blog.csdn.net/linqianbi/article/details/78617615 // Gamma 校正 #include <iostream> ...

  6. 图像灰度变化MATLAB代码

    I=imread('cameraman.tif'); [M N]=size(I); for i=1:Mfor j=1:NI1(i,j)=floor(I(i,j)/16)*16;//改变此处的值即可改变 ...

  7. 【Halcon视觉】图像灰度变化

    图像灰度变换的目的,是为了提高图像的对比度,对比度越高,清晰度越高. 1.灰度线性变换 add_image()    图像相加 invert_image()     图像取反 2.灰度非线性变换 lo ...

  8. 【OpenCV图像处理】十六、图像空域滤波(下)

    空域滤波的后半部分主要讲图像的锐化相关操作. 图像锐化: 由于成像机理和成像设备的限制,尤其是对于一些专用成像设备,如医学成像,遥感成像和视频捕获等等,所成图像可能会变得模糊.图像锐化的作用就是增强图 ...

  9. LabVIEW图像灰度分析与变换(基础篇—4)

    目录 1.图像灰度分析 1.1.直方图分析 1.1.1.灰度图像直方图分析 1.1.2.彩色图像直方图分析 1.2.线灰度曲线分析 1.3.图像线灰度均值分析 1.4.图像形心和质心分析 1.5.图像 ...

最新文章

  1. java电话号码开头_JS使用正则验证手机号包含400和800开头号码
  2. 算法提高课-图论-欧拉回路和欧拉路径-AcWing 1184. 欧拉回路:有向图和无向图的欧拉回路
  3. 如何配置mysql8.0_安装和配置Mysql8.0
  4. CodeForces 1058C C. Vasya and Golden Ticket
  5. 东方终焉组引导页自适应html源码 视频背景炫酷
  6. python中文版-python有中文版吗
  7. Spell Checker
  8. vue+腾讯位置服务 实现坐标拾取器功能
  9. 黑猴子的家:SVN 服务端创建资料库
  10. 华为手机序列号前三位_华为手机SN码里隐藏的秘密,选购手机必备冷知识!
  11. Why ASMLIB and why not?
  12. 有3n个花盆,红色、蓝色和黄色的各n个。开始时排列的顺序是混乱的,如黄、红、蓝、黄、黄、蓝、黄、红、红……
  13. nubia/努比亚Z5Sn(32GB) root教程_方法
  14. 读 S. Meyers 之《Effective C++:改善程序与设计的55个具体做法:第3版》
  15. Geekban极客班 第三周
  16. web直播、即时聊天流程图。第三方平台
  17. 悬浮球_封装_autojs
  18. 超详细的--STP理论
  19. ubuntu下buffalo wzr-hp-300nh路由器刷DD-WRT系统
  20. 在论文中经常读到的motifs是什么意思?

热门文章

  1. linux java 构建工具有哪些,Linux ant --强大的Java开发构建工具
  2. html表格重置标签,HTML——表格标签
  3. java 跳转 oop_Java基础之:OOP——接口
  4. java修改 nsf中的数据_最新NSF申请指南中的一些重要改动
  5. python迷宫问题求最短路径_用栈求解迷宫问题的所有路径及最短路径程序
  6. 用代码优雅的终止springboot服务
  7. python基础--urllib
  8. keras 的 example 文件 cifar10_resnet.py 解析
  9. 【神经网络】(15) Xception 代码复现,网络解析,附Tensorflow完整代码
  10. java数独中数独空格初始化,java高手近解决数独问题,看你是不是高手!