原文链接:https://blog.csdn.net/maozefa/article/details/4778934

图像亮度调整分为非线性和线性两种方法。

非线性图像亮度是将图像像素的R、G、B分别加上或减去某个值,其优点是代码简单,亮度调整速度快;缺点是图像信息损失较大,调整过的 图像显得平淡,无层次感。

线性图像亮度一般是将图像像素的RGB转换为HSL(HSV)等颜色空间,对L(V)部分进行增减调整后,再转换为RGB颜色空间,优点是调整过图像层次感很强;缺点是代码较复杂,调整速度慢,而且当图像亮度增减量较大时有很大的失真。

针对上面两种方法的优缺点,本人参照Photoshop的对比度、饱和度调整原理(可参见本人的有关文章),对图像亮度调整方法进行了改进,经测试,效果还不错,主要有不失真调整范围宽、有较好的层次感、尽可能减少图像信息损失量等;同时,在代码处理上,采用了灰度表查找法,先按制造了一个256个元素大小的线性亮度/对比度查找表,然后对图像数据逐像素按R、G、B分量值在查找表中取得调整后的数据,因此处理速度同《Delphi图像处理 -- 亮度/对比度调整》中的非线性亮度/对比度是基本相同的。

原理用公式表示为:

如果亮度增减量value范围为 -1  --  +1,当value > 0时:

rgb = RGB + RGB * (1 / (1 - value) - 1)

当value < 0时:

rgb = RGB + RGB * value

PS所用的正是线性方法,在PS6中也没有改变。原文代码非C++,且所用方法为HASH查表加速方法,比较难懂,我用C++实现了相同的方法没有进行HASH查表法,速度上较差。

其中色相饱和度和明度原本只以为是简单的HSV模型进行的应用,但是实际用简单加减,色相和饱和度大致相同。明度方面有较大差异,明度明显范围和PS6新版本方法不一致,在最大值处取不到白色,最小值处取不到黑色。

因此参考了原文链接:https://blog.csdn.net/matrix_space/article/details/72303250中关于明度的计算方法。

主要思想是PS的明度调整是采用Alpha合成方式,这里的value就是Alpha,公式前面部分RGB * (1 - value)的是图像部分,后面的255 * value部分则是一个白色遮照层,明度越大,遮照层的Alpha越大,图像就越谈,反之亦然。而明度的负调整则是以一个黑色遮照层来完成的。负100%就全黑了。只有遮照层Alpha=0,也就是明度值为0时,才是完完全全的图片显示。
明度调整,利用图层的合成
如果alpha大于0,相当于利用一个白色遮罩层合成
RGB = RGB * (1 - alpha) + 255 * alpha;
如果alpha小于0,相当于利用一个黑色遮罩层合成
RGB=RGB * (1+alpha) + 0 * alpha;

具体的代码实现如下范围阈值输入为

输入参数依次为:
      i_light亮度(-150到+150)
      contrast对比度(-50到100)
      hue色相(-180到+180)
      i_saturation饱和度(-100到+100) 
      输入图像与输出图像等大小三通道

代码基于QT界面

void ImageTools::AdjustImageColor(QImage *io_image, int i_light, int i_contrast,int i_hue, int i_saturation, int i_value,int progress_start, int progress_end, ProgressCallBackPtr callProgress)
{auto myClamp = [](int a, int min, int max)->int { return (a < min) ? min : (a > max) ? max : a; };//lambda表达式int width = io_image->width();int height = io_image->height();int oldDisplayPos = progress_start;//界面显示进度int progress_total = progress_end - progress_start;//进度总量int total = width * height;//工作总量int pos = 0;//当前工作进度float c = i_contrast / 100.0f;float b = i_light/255.f;int nRed, nGreen, nBlue;int result_color[3] = {0};int h, s, v;for (int x = 0; x < width; ++x) {for (int y = 0; y < height; ++y) {QColor var = io_image->pixelColor(x, y);var.getHsv(&h, &s, &v);h += i_hue;if (h<0){h = h + 360;}else if(h>360){h = h - 360;}s += 2.55*i_saturation;if (s<0){s = 0;}else if(s>255){s = 255;}var.setHsv(h, s, v);var.getRgb(&nRed, &nGreen, &nBlue);//明度新公式int value= 2.55*i_value;if (value>0){nRed = (nRed * (255 - value) + 255 * value) / 255;nGreen = (nGreen * (255 - value) + 255 * value) / 255;nBlue = (nBlue * (255 - value) + 255 * value) / 255;}else {nRed = (nRed * (255 + value) + 0 * value) / 255;nGreen = (nGreen * (255 + value) + 0 * value) / 255;nBlue = (nBlue * (255+ value) + 0 * value) / 255;}int color[3] = {nRed, nGreen, nBlue};for (int i = 0; i < 3; ++i) {if (b>0.0){color[i] = color[i] + color[i] * (1 / (1 - b) - 1)*0.85;}else{color[i] = color[i] + color[i] * b*0.65;}result_color[i] = color[i] +(color[i] -127.5) * c;result_color[i] = myClamp(result_color[i], 0, 255);} io_image->setPixelColor(x, y, QColor(result_color[0], result_color[1], result_color[2]));if (callProgress) {//进度条设置pos++;int newDisplayPos = (double)pos / (double)total * progress_total + progress_start;if (newDisplayPos > oldDisplayPos && newDisplayPos <= progress_end){oldDisplayPos = newDisplayPos;callProgress(oldDisplayPos);}}}}}

在QT框架下进行仿照PS图像调整功能设计(亮度对比度,色相饱和度及明度)相关推荐

  1. C++/Qt框架下的简易计算器

    C++/Qt框架下的简易计算器 1.简易计算器-介绍 该项目目标是设计开发一个支持连续计算的简易计算器,通过单击按钮,输入并完成如4+5+6或5×8+16类似的各种连续计算,并将运算结果显示在输出文本 ...

  2. python 调整灰度图像对比度_Python实现PS图像调整之对比度调整功能示例

    本文实例讲述了Python实现PS图像调整之对比度调整功能.分享给大家供大家参考,具体如下: 这里用 Python 实现 PS 里的图像调整–对比度调整.具体的算法原理如下: (1).nRGB = R ...

  3. python 操作ps_Python实现PS图像调整之对比度调整功能示例

    本文实例讲述了Python实现PS图像调整之对比度调整功能.分享给大家供大家参考,具体如下: 这里用 Python 实现 PS 里的图像调整–对比度调整.具体的算法原理如下: (1).nRGB = R ...

  4. Python: PS 图像调整--饱和度调整

    本文用 Python 实现 PS 图像调整中的饱和度调整算法,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/detail ...

  5. python 操作ps_Python实现PS图像调整黑白效果示例

    本文实例讲述了Python实现PS图像调整黑白效果.分享给大家供大家参考,具体如下: 这里用Python 实现 PS 里的图像调整–黑白,PS 里的黑白并不是简单粗暴的将图像转为灰度图,而是做了非常精 ...

  6. Python: PS 图像调整--亮度调整

    本文用 Python 实现 PS 图像调整中的亮度调整,具体的算法原理和效果可以参考之前的博客: http://blog.csdn.net/matrix_space/article/details/2 ...

  7. Python: PS 图像调整--明度调整

    本文用 Python 实现 PS 图像调整中的明度调整: 我们知道,一般的非线性RGB亮度调整只是在原有R.G.B值基础上增加和减少一定量来实现的,而PS的明度调整原理还得从前面那个公式上去找.我们将 ...

  8. python黑的调白的_Python实现PS图像调整黑白效果示例

    本文实例讲述了Python实现PS图像调整黑白效果.分享给大家供大家参考,具体如下: 这里用Python 实现 PS 里的图像调整–黑白,PS 里的黑白并不是简单粗暴的将图像转为灰度图,而是做了非常精 ...

  9. PS 图像调整算法——饱和度调整

    算法参考自 阿发伯 的博客. http://blog.csdn.net/maozefa 饱和度调整 图像的饱和度调整有很多方法,最简单的就是判断每个象素的R.G.B值是否大于或小于128,大于加上调整 ...

最新文章

  1. 平均年薪50.8万,这个证书真!香!
  2. scrapy基础知识之 parse()方法的工作机制思考:
  3. PowerDesigner pdm生成Access的方法
  4. mysql count里面能加条件吗_select count(1) 和 count(*),哪个性能更好?
  5. 星空连线html5,js canvas实现星空连线背景特效
  6. html网页设计需求分析,网页设计需求分析方法
  7. ansys命令流——网格划分基础操作
  8. 【直击】腾讯SaaS加速器首期复试现场:122位CEO争夺30席入场券,激烈!
  9. python找不到指定模块之几种可能的解决办法:
  10. 清橙OJ A1046 加法器
  11. 计算机图形学第一次上机——中点线算法和中点圆算法
  12. “丧偶式”恋爱?博士男友每晚12点才回家,要分手吗......
  13. 【转】Hibernate中session的clear(),flush(),evict()方法详解
  14. 6个做好网站SEO必不可少的方法
  15. 在 Windows 10 中更改默认浏览器
  16. 阿里云王文彬:希望云计算支撑百亿设备
  17. 董明珠如何渗透珠海银隆 联手万达等企业拿下22%股权
  18. 点击超链接实现文件下载而不是打开
  19. oracle直接将日期转为月份,如何使用Oracle将日期转换为周,月,季度,半年,年...
  20. uniAPP开发 全教程

热门文章

  1. Burp Suite之Scaner模块(三)
  2. mysql常考50_要想学好SQL语句必会的50题,也是考试常考的点
  3. 拒绝调包 手写实现神经网络(复习专用)
  4. 各类游戏对应服务端架构
  5. pcie台式网卡无法开热点
  6. 使用VM安装Centos7虚拟机
  7. AOP注解和切入点表达式
  8. 为什么上传速度比下载速度慢
  9. Scons入门指南 使用教程 笔记
  10. 智能时代怎么能少了老年人