跟我一起学opencv 第五课之调整图像亮度和对比度
一.调整图像亮度与对比度
1.图像变换
---像素变换-点操作
---邻域操作-区域操作
调整图像亮度和对比度属于像素变换-点操作
公式为:g(i,j) = αf(i,j) + β 其中α>0 ,β是增益变量
处理图像经常会对图像色彩进行增强,这就是改变图像的亮度β和对比度α,
我们看看实例代码:
#include<opencv2\opencv.hpp>
#include<iostream> using namespace std;
using namespace cv;
/*图像操作*/
int main(int argc, char **argv)
{
Mat src1 = imread("E:\\vsprom\\learn05\\v15.jpg"); if (src1.empty())
{
cout << "can not load imagefile1...." << endl;
return -;
}
namedWindow("in1 image win", CV_WINDOW_AUTOSIZE);
imshow("in1 image win", src1); int height = src1.rows;
int width = src1.cols; Mat dst = Mat::zeros(src1.size(), src1.type());//创建一副与src1同样的图像,并将像素值全部给0
float alpha = 1.2;
float beta = ;
for (int row = ; row < height; row++)
{
for (int col = ; col < width; col++)
{
if (src1.channels() == )//三通道图像
{
float b = src1.at<Vec3b>(row, col)[];//通道1
float g = src1.at<Vec3b>(row, col)[];//通道2
float r = src1.at<Vec3b>(row, col)[];//通道3 dst.at<Vec3b>(row, col)[] = saturate_cast<uchar>(b*alpha + beta);//使用公式
dst.at<Vec3b>(row, col)[] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[] = saturate_cast<uchar>(r*alpha + beta); }
else if (src1.channels() == )//单通道图像
{
float v = src1.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
}
}
}
namedWindow("dst image win", CV_WINDOW_AUTOSIZE);
imshow("dst image win", dst); waitKey();
return ;
}
效果如下此时α=1.2,β=30
效果如下α=1.2,β=100时,此时更亮
效果如下α=5,β=30时,对比更明显
转换图像格式:
src2.convertTo(src1, CV_32F);
代码为:
#include<opencv2\opencv.hpp>
#include<iostream> using namespace std;
using namespace cv;
/*图像操作*/
int main(int argc, char **argv)
{
Mat src2 = imread("E:\\vsprom\\learn05\\v15.jpg"); if (src2.empty())
{
cout << "can not load imagefile1...." << endl;
return -;
}
namedWindow("in1 image win", CV_WINDOW_AUTOSIZE);
imshow("in1 image win", src2); Mat src1;
src2.convertTo(src1, CV_32F); int height = src1.rows;
int width = src1.cols; Mat dst = Mat::zeros(src2.size(), src2.type());//创建一副与src1同样的图像,并将像素值全部给0
float alpha = 1.2;
float beta = ;
for (int row = ; row < height; row++)
{
for (int col = ; col < width; col++)
{
if (src1.channels() == )//三通道图像
{
float b = src1.at<Vec3f>(row, col)[];//通道1
float g = src1.at<Vec3f>(row, col)[];//通道2
float r = src1.at<Vec3f>(row, col)[];//通道3
//修改像素值
dst.at<Vec3b>(row, col)[] = saturate_cast<uchar>(b*alpha + beta);
dst.at<Vec3b>(row, col)[] = saturate_cast<uchar>(g*alpha + beta);
dst.at<Vec3b>(row, col)[] = saturate_cast<uchar>(r*alpha + beta); }
else if (src1.channels() == )//单通道图像
{
float v = src1.at<uchar>(row, col);
dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
}
}
}
namedWindow("dst image win", CV_WINDOW_AUTOSIZE);
imshow("dst image win", dst); waitKey();
return ;
}
效果图:
跟我一起学opencv 第五课之调整图像亮度和对比度的更多相关文章
- 跟我一起学opencv 第五课之图像的混合
*理论-线性混合操作 g(x) = (1-α)f0(x)+αf1(x) α的取值范围位0-1之间 f0(x)为图像1,f1(x)表示第二张图像 α是混合系数 g(x)是生成的图像,对每一个像素 ...
- openCV - 5~7 图像混合、调整图像亮度与对比度、绘制形状与文字
5. 图像混合 理论-线性混合操作.相关API(addWeighted) 理论-线性混合操作 用到的公式 (其中 α 的取值范围为0~1之间) 相关API(addWeighted) 参数1:输入图像M ...
- 跟我一起学opencv 第四课之图像的基本操作
1.图像是由像素组成的,所以修改了像素就可以实现图像的改变. 2先看灰度图像(单通道): *****2.获取灰度图像的像素值使用: int gray = gray_src.at<uchar&g ...
- 跟我一起学opencv 第三课之图像在opencv中的表示-Mat对象
1.下面第一章图是一位美女图像,和其他数据一样图像在计算机中也是以二进制存储,下面第二张图 2.在摄像头眼里一幅图像就是一个矩阵或者说是二维数组,数组元素是像素值 3.opencv中以Mat对象表示图 ...
- linux就该这么学,第五课,
今天讲的比较难理解,要重预习和复习 今天讲了2个多小进,主要讲了SHELL,shell的组成:第一行为脚本声明 #!/bin/bash ,第二行为脚本的注释信息,第三为 脚本的执行语句 接收用户参 ...
- 快学Scala 第五课 (构造映射,获取映射值,更新映射值,迭代映射,与Java互操作)
构造映射: val score = Map[String, Int]() val score1 = HashMap[String, Int]() val value1 = Map[String, In ...
- 从零开始学Kotlin第五课
函数式编程入门: package EL fun main(args: Array<String>) { var names= listOf<String>("tom& ...
- opencv::调整图像亮度与对比度
图像变换可以看作如下: - 像素变换 – 点操作 - 邻域操作 – 区域 调整图像亮度和对比度属于像素变换-点操作 //创建一张跟原图像大小和类型一致的空白图像.像素值初始化为0 Mat new_im ...
- 【C语言探索之旅】 第二部分第五课:预处理
内容简介 1.课程大纲 2.第二部分第五课: 预处理 3.第二部分第六课预告: 创建你自己的变量类型 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语 ...
随机推荐
- 阿里云部署java项目参考如下链接
http://www.cnblogs.com/softidea/p/5271746.html https://oneinstack.com/question/how-to-deploy-java-ap ...
- 1.用互联网的产品思维打造一本app后端的书
刚刚接触app后端,是做完adidas中国的官方商城的时候,那时不清楚app后端应该怎么架构,只能摸着石头过河,网络上只有一些零散的资料,遇到问题,只能不断地搜索,思考,务必找到解决问题的方法. 在从 ...
- python之@property
在绑定属性时,如果我们直接把属性暴露出去,虽然写起来很简单,但是,没办法检查参数,导致可以把成绩随便改: s = Student() s.score = 9999 这显然不合逻辑.为了限制score的 ...
- HTML5 FormData 方法介绍以及实现文件上传
XMLHttpRequest 是一个浏览器接口,通过它,我们可以使得 Javascript 进行 HTTP (S) 通信.XMLHttpRequest 在现在浏览器中是一种常用的前后台交互数据的方式. ...
- Python集合set
集合 set 集合是无序的 集合的值是唯一的 求两个集合的关系: list1 = [1,4,5,7,3,6,7,9] list2 = set([2,6,0,66,22,8,4]) list3 = se ...
- TestNG失败自动截图
转自:https://www.cnblogs.com/tobecrazy/p/4814813.html
- 关于Flask-Login中session失效时间的处理
最近需要使用Python开发web系统,主要用到的框架就是Flask,前端使用Jinja2模板引擎和Bootstrap,web容器使用Cherrypy,其中关于Login管理的使用了Flask-Log ...
- 在Windows Server 2008 R2下搭建jsp环境(二)-JDK的下载安装
因为服务器上的Tomcat的运行环境需要JDK的支持,所以,掌握JDK的安装与下载和配置是一个重要步骤. 1.首先下载最新的JDK版本.网络上提供了最新版本的JDK下载,如图所示.首先选择&quo ...
- 在使用MFC对话框时遇到的用户交互
有时我们需要点击对话框上的一个按钮的时候,对话框隐藏起来,然后执行完某个操作后,对话框又弹出来, 这时我们可以使用BeginEditorCommand()和CompleteEditorCommand( ...
- noip2010 引水入城 bfs+贪心
如果能够实现,每个河边的城市对应的控制区域一定是一条线段. 所以直接bfs每个河边的城市,贪心线段的右端点 #include<cstdio> #include<cstring> ...