目录

  • 一 提升图像对比度和亮度
  • 二 代码实现
  • 三 实现效果


注:原创不易,转载请务必注明原作者和出处,感谢支持!

一 提升图像对比度和亮度

一般来说图像的变换可以分成以下两类:
(1)像素变换
在像素变换中,仅仅根据输入的像素值(有时可能加上某些全局信息或者参数)来计算相应的输出像素值。该类变换的常见方法有亮度和对比度调整、颜色校正和颜色变换等等。该类变换可以用下面的通用变换公式来表示。\(f(x,y)\)表示原图像\((x,y)\)处的像素值,\(T\)表示变换函数,\(g(x,y)\)表示输出图像\((x,y)\)处的像素值。可以看到输入仅有当个位置的像素值。
\[ g(x, y) = T[f(x, y)] \]

(2)邻域变换
在邻域变换中,变换函数的输入可以是多个像素所构成的一个邻域,然后根据变换函数计算相应的像素值输出。邻域变换最常见的方法有图像卷积操作。对于图像卷积,假设中心锚点位置为\((x,y)\),滤波器大小为\(m \times n\),且\(m\)和\(n\)均为奇数(滤波器大小一般均为奇数)。令\(a = (m-1)/2\),\(b = (n-1)/2\),矩阵\(w\)为滤波器系数,原图像为\(f\),输出图像为\(g\),则图像的卷积操作可以用下面的通用公式表示。
\[ g(x,y) = \sum_{s=-a}^a \sum_{t=-b}^b w(s,t)f(x+s, y+t) \]

而提升图像对比度和亮度是一个典型的像素变换操作,它的变换公式表示如下。如果你想要提升图像亮度(针对灰度图),那你只需要令\(\alpha = 1\),并使\(\beta\)的值大于0,使图像的亮度得到一个增益即可。此时,图像的每个像素都将提升\(\beta\)个灰度值。如果你想要提升图像对比度,那你只需要令\(\beta = 0\),并使\(\alpha\)的值大于1,使得图像相邻像素差值变大从而提升图像的对比度。如果你既要提升对比度和亮度,则只需要选择\(\alpha\)为大于1的合适值和\(\beta\)为大于0的合适值即可。
\[ g(x,y) = \alpha f(x, y) + \beta \]


二 代码实现

OpenCV中提供了一个实现提升图像对比度和亮度的APIconvertTo()如下。

void cv::Mat::convertTo(OutputArray m,      // 输出图像int rtype,          // 输出图像类型,取-1则表示类型与原图相同double alpha = 1,   // alpha值double beta = 0     // beta值
) const;

如果不使用convertTo(),则可以将手写代码实现如下。

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main(int argc, char **argv)
{// load source image and show itMat src = imread("D:\\IMG\\lena.jpg", IMREAD_UNCHANGED);if (!src.data){cout << "Error : could not load image." << endl;return -1;}imshow("input", src);// parameters for enhance contrastdouble alpha = 2.0;double beta = 0.0;Mat dst(src.size(), src.type());decltype(src.rows) row, col;for (row = 0; row < src.rows; ++row){for (col = 0; col < src.cols; ++col){// single channel (gray image) or three channels (BGR image) onlyif (src.channels() == 1){int gray = src.at<uchar>(row, col);dst.at<uchar>(row, col) = saturate_cast<uchar>(gray * alpha + beta);}else if (src.channels() == 3){int b = src.at<Vec3b>(row, col)[0];int g = src.at<Vec3b>(row, col)[1];int r = src.at<Vec3b>(row, col)[2];dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b * alpha + beta);dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g * alpha + beta);dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r * alpha + beta);}}}imshow("output (alpha = 2)", dst);waitKey(0);return 0;
}

如果使用APIconvertTo(),则可以简单地作如下实现。

src.convertTo(dst, -1, alpha, beta);

三 实现效果

(1) 单纯提升亮度
原图

手写代码实现,\(\beta\)分别为50、100、150

调用API实现,\(\beta\)分别为50、100、150

(2) 单纯提升对比度
原图

手写代码实现,\(\alpha\)分别为2、3、4

调用API实现,\(\alpha\)分别为2、3、4

(3) 同时提升对比度和亮度,\(\alpha = 3\),\(\beta = 50\)

可以看到,手写代码实现的效果与调用API实现的效果略有不同,但大体效果是不差多少的。在熟悉了API实现原理之后,以后就可以直接调用API进行实现而无需自己手动写代码实现。

转载于:https://www.cnblogs.com/laizhenghong2012/p/11254079.html

提升图像对比度和亮度相关推荐

  1. 《OpenCV3编程入门》学习笔记5 Core组件进阶(四)图像对比度、亮度值调整

    第5章 Core组件进阶 5.4 图像对比度.亮度值调整 5.4.1 理论依据 1.算子:一般图像处理算子都是一个函数,接受一个或多个输入图像,并产生输出图像 2.算子一般形式: 3.点操作(poin ...

  2. opencv计算图像亮度调节_OpenCV教程创建Trackbar图像对比度、亮度值调整

    这篇文章中我们一起学习了如何在OpenCV中用createTrackbar函数创建和使用轨迹条,以及图像对比度.亮度值的动态调整. 文章首先详细讲解了OpenCV2.0中的新版创建轨迹条的函数crea ...

  3. 【OpenCV】OpenCV实战从入门到精通之 -- 图像对比度、亮度值调整

    理论依据 首先了解一下算子的概念.一般的图像处理算子都是一个函数,它接受一个或多个输入图像,并产生输出图像.下面是算子的一般形式: 或者 图像亮度和对比度的次奥做属于图像变换中比较简单的点操作(poi ...

  4. python3-opencv库(4)--图片像素运算,利用加权叠加调节图像对比度和亮度

    版权声明:转载请注明原作者及出处 本文所涉及的一切图像像素运算,前提都是两张图尺寸相同,通道数相同 import numpy as np from cv2 import cv2"" ...

  5. 【图像处理】OpenCV系列五 --- 图像对比度、亮度值调整

    今天呢,我们一起学习一下,如何调整图像的对比度以及亮度. 一.原理 调整图像亮度与对比度所用的公式 g(i,j) = a * f(i,j) + b 其中,i 和 j 表示像素位于第i行 和 第j列 . ...

  6. OpenCV C++ 图像对比度和亮度

    目录 知识点 亮度和对比度调整原理 示例代码 reference 知识点 在本文中将了解到以下几个方面的内容: 1.C++ OpenCV访问像素值:2.用0初始化矩阵:3.saturate_cast起 ...

  7. OpenCV之图像对比度、亮度值调整

    先上代码 #include <iostream> #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> ...

  8. opengl 图像对比度、亮度、饱和度调节的glsl代码

    原理:把RGB转换成HSV,调节后转回成RGB.直接贴代码: 查表法还在研究中getTable()函数无效,由于获取的像素点是float型不能放到数组table中cTable[vec4[0]],不能编 ...

  9. 独家|OpenCV 1.6 改变图像的对比度和亮度!

    翻译:陈之炎 校对:吴金迪本文约2500字,建议阅读5分钟本文为大家介绍了OpenCV改变图像的对比度和亮度. 目标 在本教程中, 你将学习到以下内容: 访问像素值; 用零初始化矩阵; 学习CV :: ...

最新文章

  1. keyshot怎么批量渲染_提高Keyshot逼真渲染的小技巧
  2. GLSL着色器周记02
  3. iperf3 测速跑不满的解决办法
  4. JPA中实现查询list
  5. 深度剖析WinPcap之(九)——数据包的发送过程(8)
  6. y空间兑换代码_loam代码解析3
  7. MyCat分布式数据库集群架构工作笔记0020---高可用_单表存储千万级_海量存储_水平分表ER表
  8. python生成词云_词云制作没那么难,Python 10 行代码就实现了!
  9. 130242014021-田富钊-实验一
  10. Linux_ubuntu16.04 无线/Wifi 上网速度慢的解决方法
  11. 浏览器渲染原理及web前端分析
  12. wps在Linux上使用命令打开文档的方法
  13. P6091 【模板】原根
  14. 匠心开岁月·车库创乾坤 —— 微软创新节暨中国创新车库开幕
  15. 电子科大自考c语言试题,220名北京考生赶考国科大 面试题目无刚性答案
  16. 量化交易 米筐 交易接口与投资信息
  17. colly爬虫库学习笔记
  18. 关于微信小程序跳转页面后不刷新问题,和页面跳转后左上角还保留了之前的页面,和存在返回按钮的解决方法
  19. 破局行业“区块链孤岛”,百度发起成立国内首个区块链开源工作组
  20. iOS - 广告标识符(IDFA IDFV)

热门文章

  1. tcpip c语言程序设计,TCP 服务端和客户端程序设计(C)
  2. ue4材质节点怎么用_UE4材质教程
  3. ldap导入mysql_openLDAP 部署(亲测可用)
  4. 计算机心得300,计算机实训总结计算机实训心得300
  5. Tomcat的安装和运行
  6. 字典序最小是什么意思_《拓扑序简介》第十六讲
  7. 中国医科大学计算机应用基础本科在线作业,中国医科大学《计算机应用基础(本科)》在线作业.doc...
  8. 计算机课例,计算机的基本组成教学课例
  9. 路由器选华硕还是tp_路由器的坑太多,就算写着“千兆”你也要当心丨618选购指南...
  10. 基于ssm的个人博客_基于 CentOS7 搭建 WordPress 个人博客