目录

0 提问

1.1 原理

trick:

1.2 代码

1.3 结果


0 提问

  • 访问像素值

  • 用0初始化矩阵

  • saturate_cast 是做什么用的,以及它为什么有用

1.1 原理

图像处理

  • 一般来说,图像处理算子是带有一幅或多幅输入图像、产生一幅输出图像的函数。

  • 图像变换可分为以下两种:

    • 点算子(像素变换)

    • 邻域(基于区域的)算子

像素变换

  • 在这一类图像处理变换中,仅仅根据输入像素值(有时可加上某些全局信息或参数)计算相应的输出像素值。

  • 这类算子包括 亮度和对比度调整 ,以及颜色校正和变换。

亮度和对比度调整

  • 两种常用的点过程(即点算子),是用常数对点进行 乘法加法 运算:

  • 两个参数 一般称作 增益偏置 参数。我们往往用这两个参数来分别控制 对比度亮度

  • 你可以把 看成源图像像素,把 看成输出图像像素。这样一来,上面的式子就能写得更清楚些:

    其中, 表示像素位于 第i行第j列

为了执行运算 ,我们要访问图像的每一个像素。因为是对RGB图像进行运算,每个像素有三个值(R、G、B),所以我们要分别访问它们。下面是访问像素的代码片段:

for( int y = 0; y < image.rows; y++ )
{for( int x = 0; x < image.cols; x++ ){for( int c = 0; c < 3; c++ ){new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );}}
}

注意以下两点:

  • 为了访问图像的每一个像素,我们使用这一语法: image.at(y,x)[c] 其中, y 是像素所在的行, x 是像素所在的列, c 是R、G、B(0、1、2)之一。

  • 因为 的运算结果可能超出像素取值范围,还可能是非整数(如果 是浮点数的话),所以我们要用 saturate_cast 对结果进行转换,以确保它为有效值。

trick:

我们可以不用 for 循环来访问每个像素,而是直接采用下面这个命令:

image.convertTo(new_image, -1, alpha, beta);

这里的 convertTo 将执行我们想做的 ***new_image = a\*image + beta*** 。然而,我们想展现访问每一个像素的过程,所以选用了for循环的方式。实际上,这两种方式都能返回同样的结果。

1.2 代码

double alpha; /**< 控制对比度 */
int beta;  /**< 控制亮度 */
​
int main(int argc, char** argv)
{/// 读入用户提供的图像Mat image = imread("C://Users//guoqi//Desktop//ch7//2.jpg");resize(image, image, Size(800, 400));Mat new_image = Mat::zeros(image.size(), image.type());
​/// 初始化cout << " Basic Linear Transforms " << endl;cout << "-------------------------" << endl;cout << "* Enter the alpha value [1.0-3.0]: ";cin >> alpha;cout << "* Enter the beta value [0-100]: ";cin >> beta;
​/// 执行运算 new_image(i,j) = alpha*image(i,j) + betafor (int y = 0; y < image.rows; y++){for (int x = 0; x < image.cols; x++){for (int c = 0; c < 3; c++){new_image.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(alpha*(image.at<Vec3b>(y, x)[c]) + beta);}}}
​/// 创建窗口namedWindow("Original Image", 1);namedWindow("New Image", 1);
​/// 显示图像imshow("Original Image", image);imshow("New Image", new_image);cv::imwrite("C://Users//guoqi//Desktop//ch7//4.jpg", image);/// 等待用户按键waitKey();return 0;
}

1.3 结果

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

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

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

  2. OpenCV学习:改变图像的对比度和亮度

    本实例演示简单地改变图像的对比度和亮度,使用了如下线性变换来实现像素值的遍历操作: The parameters α > 0 and β often called the gain and bi ...

  3. OpenCV改变图像的对比度和亮度

    OpenCV改变图像的对比度和亮度 改变图像的对比度和亮度 目标 理论 图像处理 像素变换 亮度和对比度调整 代码 解释 结果 改变图像的对比度和亮度 目标 在本教程中,您将学习如何: 访问像素值 用 ...

  4. OpenCV学习笔记之改变图像的对比度和亮度

    一.图像对比度和亮度 图像对比度指的是一幅图像中明暗区域最亮的白和最暗的黑之间不同亮度层级的测量,即指一幅图像灰度反差的大小.差异范围越大代表对比越大,差异范围越小代表对比越小,好的对比率120:1就 ...

  5. 基于OpenCV调整图像的对比度和亮度

    亮度和对比度的调整原理 公式原理: new_image = a*image + beta 即 g(x)=αf(x)+β 其中,α>0 , β 通常被称为 gain 或者 bias 参数,通常这两 ...

  6. 改变图像的对比度和亮度

    调整图像的对比度和亮度(通过线性方法) 一提到线性方法我们第一时间应该会联想到:二元一次方程 这里openCV介绍的一个函数方法就是利用二元一次方程线性修改图像中的像素值 这种算子能够调整图片亮度和对 ...

  7. Chapter_06 更改图像的对比度和亮度

    文章目录 一. 本章目标 ① 目标 ② 理论 ③ 代码 二. 实例 ① 亮度和对比度调整 ② 伽马校正 ③ 纠正曝光不足的图像 三. 图形渲染中的伽马校正(附加资源) 一. 本章目标 ① 目标 本教程 ...

  8. OpenCV-调整图像的对比度、亮度

    OpenCV-调整图像的对比度.亮度 author@jason_ql http://blog.csdn.net/lql0716 1.图像的对比度.亮度调整原理 f(x):原图像的像素 g(x):输出图 ...

  9. OpenCV 【十】——Gamma校正 ——图像灰度变化

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

最新文章

  1. qt5.6.3下使用firebird
  2. 第1关:求1000以内所有的水仙花数
  3. 公众号第三方平台开发 获取 component_verify_ticket
  4. 判断objcet是否是map类型_57、递归+树的深度+map-二叉搜索树的平衡性
  5. python redis用法详解
  6. Visual Studio 2019 + MFC——配置MFC
  7. lamp不解析php,lamp环境无法解析php环境
  8. 【渝粤题库】国家开放大学2021春2402外国文学题目
  9. 操作系统课设——设计模拟一个SPOOLING假脱机输出程序
  10. ensp华为数通远程登录配置
  11. DIV+CSS命名规范
  12. 更改 matlab java 版本_64位 JDK 1.8 调用Matlab 2017b打包的jar
  13. WPS表格如何快速添加斜线表头
  14. NOIP2015初赛成绩
  15. 冬天吃柿子养颜防衰老
  16. 计算机word考试试题模板,2017年职称计算机考试Word2003巩固练习题13
  17. 如何录制一个小的 gif
  18. 根据经纬度坐标获得省市区县行政区划城市名称,自建数据库 java python php c# .net 均适用
  19. Android App应用启动分析与优化
  20. 将一个数组按照从小到大的顺序排列

热门文章

  1. 华为怎么改输入法皮肤_搜狗输入法皮肤挑花眼?这次皮肤效果也能划着看了
  2. 超算学院计算机系吧,上海交通大学计算机科学与工程系(CSE)
  3. 蚂蚁金服 java电话面_蚂蚁金服前端电话面试(一面)
  4. python install scikit-image后,报错ImportError: DLL load failed: 找不到指定的模块
  5. python基础--urllib
  6. 1.(基于欧式距离聚类实现的点云分割)
  7. POJ - 2513 Colored Sticks 欧拉通路+并查集+静态树
  8. java bag集合_集合基于数组的实现:ArrayBag.java
  9. chrome java插件_selenium启动Chrome配置参数问题
  10. 使用希捷DiscWizard格式化3TB硬盘并分区