C++之OpenCV入门到提高007:调整图像亮度和对比度
一、介绍
今天是这个系列《C++之 Opencv 入门到提高》的第七篇文章。这篇文章也不难,介绍如何调整图像的亮度。图像本质上也是数据,既然是数据,我们就可以针对图像的每个像素进行增加或者减少的的操作,这样的结果就是图片变暗或者变亮了。这个调整的过程不是随便操作、无限制的,因为有些结果并不是我们想要的,我们为了让图片每个像素变化的更合理,就可以使用【saturate_cast】函数进行控制,好好的体会一下吧。这都是基础,为以后的学习做好铺垫。虽然操作很简单,但是背后有很多东西需要我们深究,才能做到知其然知其所以然。OpenCV 具体的简介内容,我就不多说了,网上很多,大家可以自行脑补。
OpenCV 的官网地址:https://opencv.org/,组件下载地址:https://opencv.org/releases/。
OpenCV 官网学习网站:https://docs.opencv.ac.cn/4.10.0/index.html
我需要进行说明,以防大家不清楚,具体情况我已经罗列出来。
操作系统:Windows Professional 10(64位)
开发组件:OpenCV – 4.10.0
开发工具:Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.8.3
开发语言:C++(VC16)
二、知识学习
接口很简单,不用多说,仔细研究一下原理更有用。
1 #include <opencv2/opencv.hpp>
2 #include <iostream>
3 #include <math.h>
4
5 using namespace std;
6 using namespace cv;
7
8
9 int main()
10 {
11 //图像变换可以看做如下:
12 //1、像素变换,也就是点操作,修改像素的值,获取像素的值,调整图像的亮度和对比度等类似操作。
13 //2、领域操作,也是区域操作。可以做图像的卷积,图像特征的提取,图像梯度的计算,也可以对图像进行深度处理,比如:角点检测,模糊处理,平滑处理。
14 //
15 //调整图像亮度和对比度属于像素变换,也就是点操作。
16 //g(i,j)=af(i,j)+b,其中 a >0 ,b 是增益变量。f(i,j)表示输入图像的每个像素点,g(i,j)表示输出图像的每个像素点。
17 //a > 0,对于常规图像来说必须大于零,因为 opencv 是基于 RGB 格式来处理图像的,它的值是【0-255】,所以必须大于零。如果是 tiff 格式的图像,这个值就有可能是负值。
18 //a 这个参数的作用就是用于提高对比度的,它是乘法,是倍数增加的,所以,新的图像像素值就会比原始图像像素值有更大的变化,效果就是对比度提高了。
19 // b 就是提高图像的亮度,越亮,值越接近 255,也就是越接近白色。说白了如果我们想提高图像的亮度,就要提高 b(增益变量)的值。
20
21
22 //2、重要API
23 // Mat image=Mat::zeros(src.size(),src.type())创建一张和原图一项大小和类型的空白图像,像素初始值是0.
24 // saturate_cast<uchar>(value)确保值在【0-255】之间。
25 // Mat.at<Vec3b>(x,y)[index]=value 给指定通道每个像素赋值。
26
27
28 //3、代码演示
29
30 Mat src, dst;
31 src = imread("D:\\360MoveData\\Users\\Administrator\\Desktop\\TestImage\\3.jpg", IMREAD_COLOR);
32 if (src.empty())
33 {
34 cout << "图像加载失败!!!" << endl;
35 return -1;
36 }
37
38 namedWindow("原始图像", WINDOW_AUTOSIZE);
39 imshow("原始图像", src);
40
41 int width = src.cols;
42 int height = src.rows;
43 int channels = src.channels();
44
45 dst = Mat::zeros(src.size(),src.type());
46 double alpha = 2;
47 double beta = 40;
48 for (int row = 0; row < height; row++)
49 {
50 for (int col = 0; col < width; col++)
51 {
52 //RGB 三通道的
53 if (channels == 3)
54 {
55 float b = src.at<Vec3b>(row, col)[0];
56 float g = src.at<Vec3b>(row, col)[1];
57 float r = src.at<Vec3b>(row, col)[2];
58
59 dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha * b + beta);
60 dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha * g + beta);
61 dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha * r + beta);
62 }
63 else//Gray 单通道的
64 {
65 float v = src.at<uchar>(row, col);
66 dst.at<uchar>(row, col) = saturate_cast<uchar>(alpha * v + beta);
67 }
68 }
69 }
70
71 namedWindow("对比度图像",WINDOW_AUTOSIZE);
72 imshow("对比度图像",dst);
73
74 waitKey(0);
75 return 0;
76 }
图像亮度调整效果的对比:
调整后的效果:
效果很明显。
三、总结
这是 C++ 使用 OpenCV 的第七篇文章,其实也没那么难,操作很简单,函数也不难理解,最重要是活学活用。初见成效,继续努力。皇天不负有心人,不忘初心,继续努力,做自己喜欢做的,开心就好。
C++之OpenCV入门到提高007:调整图像亮度和对比度的更多相关文章
- 跟我一起学opencv 第五课之调整图像亮度和对比度
一.调整图像亮度与对比度 1.图像变换 ---像素变换-点操作 ---邻域操作-区域操作 调整图像亮度和对比度属于像素变换-点操作 公式为:g(i,j) = αf(i,j) + β 其中α>0 ...
- opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...
- openCV - 5~7 图像混合、调整图像亮度与对比度、绘制形状与文字
5. 图像混合 理论-线性混合操作.相关API(addWeighted) 理论-线性混合操作 用到的公式 (其中 α 的取值范围为0~1之间) 相关API(addWeighted) 参数1:输入图像M ...
- opencv::调整图像亮度与对比度
图像变换可以看作如下: - 像素变换 – 点操作 - 邻域操作 – 区域 调整图像亮度和对比度属于像素变换-点操作 //创建一张跟原图像大小和类型一致的空白图像.像素值初始化为0 Mat new_im ...
- 系列文章 -- OpenCV入门教程
<OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...
- [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑
http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑
http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...
- 【opencv入门篇】 10个程序快速上手opencv【上】
导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) PS:官方文档永远是 ...
- webdriver实用指南迁移至gitbbok并改名为selenium webdriver从入门到提高
背景 几年前我写了一本关于selenium webdriver的小册子,主要讲了一些selenium在进行测试过程中会遇到的场景以及解决方案,陆陆续续在github上收到了100+的star,在这里我 ...
- 【OpenCV入门教程之一】 安装OpenCV:OpenCV 3.0 +VS 2013 开发环境配置
图片太多,具体过程参照: [OpenCV入门教程之一] 安装OpenCV:OpenCV 3.0.OpenCV 2.4.8.OpenCV 2.4.9 +VS 开发环境配置 说下我这边的设置: 选择deb ...
随机推荐
- 掀起云端革命!ToDesk云电脑与传统PC电脑的差异分析
在科技日新月异的今天,传统PC电脑的市场地位正悄然发生变化.随着云计算技术的不断成熟与普及,云电脑逐渐走进大众视野,不同于传统PC电脑的高昂的成本和易退化的硬件性能,云电脑正以其轻成本高性能的优势吸引 ...
- 为什么我越来越喜欢用DDD — DDD架构篇(1)
Hello DDD DDD 是一种软件设计方法,DDD 是指导我们做软件工程设计的一种手段.它提供了用切割工程模型的各类技巧,如:领域.界限上下文.实体.值对象.聚合.工厂.仓储等.通过 DDD 的指 ...
- 使用FastAPI整合Gradio和Django
大家好,我是每天分享AI应用的萤火君! 经常接触机器学习的同学可能都接触过Gradio这个框架,Gradio是一个基于Python的专门为机器学习项目创建的快速开发框架,可以让开发者快速发布自己的模型 ...
- 实证化讨论OpenAI的ChatGPT的政治倾向性
- FPGA开发中的复位问题
一.为什么需要复位? 在FPGA上电时,需要对reg.fifo等器件进行复位,以确保系统处于已知的状态,同时可以通过复位清除系统的错误异常状态. 二.复位的方式 从是否与时钟同步与否可以分为异步复位和 ...
- 实现无感刷新Token技术:.Net Web API与axios的完美结合
这是我之前分享在星球里面的课程,下面整理下,分享下这个无感刷新Token技术方案. 我们都知道Token是有设置有效期的,为了安全都不会设置过长的有效期:但设置有效期太短,又会导致经常需要重新登录. ...
- Cisco Packet Tracer 交换机代码
二层交换机S1代码: >en #conf t #vlan 10 #vlan 20 #int r f 0/1-5 #sw a v 10 #int r f 0/6-10 #sw a v 20 #i ...
- P3920 WC2014 紫荆花之恋
P3920 WC2014 紫荆花之恋 毒瘤题目,动态点分树. 前置科技点 替罪羊树 高速平衡树(除去 fhq_treap 和 splay 之外的所有平衡树) 约定 \(dis(u,v)\) 为原树上 ...
- 6、oracle网络(监听)
oracle包含 1.软件 2.数据库 3.实例 4.监听(listener) 监听的特点 可以独立启动,就是说,数据库没有启动,监听可以启动:数据库启动,监听也可以不启动:数据库启动,监听也启动 监 ...
- golang读取文件
golang 按行读取文件 file, err := os.Open("app-2019-06-01.log") if err != nil { log.Fatal(err) } ...