跟我一起学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语 ...
随机推荐
- Array.prototype.slice.call()方法详解
在很多时候经常看到Array.prototype.slice.call()方法,比如Array.prototype.slice.call(arguments),下面讲一下其原理: 1.基本讲解 1.在 ...
- 玩转Web之html+CSS(一)---论坛首页表格的实现
转载请说明出处,小编博客地址:http://blog.csdn.net/u012116457 最近本来想去写一个类似论坛的页面,论坛首页一般都需要一个表格去显示数据,自己简单的写了一下,先上一张图 c ...
- Android 自定义控件实现刮刮卡效果 真的就只是刮刮卡么
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40162163 , 本文出自:[张鸿洋的博客] 很久以前也过一个html5的刮刮卡 ...
- Mongodb数据更新命令、操作符
一.Mongodb数据更新命令 Mongodb更新有两个命令:update.save. 1.1update命令 update命令格式: db.collection.update(criteria,ob ...
- 【BZOJ 3754】: Tree之最小方差树
题目链接: TP 题解: 都是骗子233,我还以为是什么神奇的算法. 由于边权的范围很小,最小生成树和最大生成树之间的总和差不会太大,所以可以枚举边权和,再直接根据方差建最小生成树,每次更新答案即可. ...
- bzoj 1210 [HNOI2004] 邮递员 插头dp
插头dp板子题?? 搞了我一晚上,还tm全是抄的标程.. 还有高精,哈希混入,还是我比较弱,orz各种dalao 有不明白的可以去看原论文.. #include<cstdio> #incl ...
- Java 使用PDFBox提取PDF文件中的图片
今天做PDF文件解析,遇到一个需求:提取文件中的图片并保存.使用的是流行的apache开源jar包pdfbox, 但还是遇到坑了,比如pdfbox版本太高或太低都不能用!!这个包竟然没有很好地做好兼容 ...
- Python并发编程之深入理解yield from语法(八)
大家好,并发编程 进入第八篇. 直到上一篇,我们终于迎来了Python并发编程中,最高级.最重要.当然也是最难的知识点--协程. 当你看到这一篇的时候,请确保你对生成器的知识,有一定的了解.当然不了解 ...
- 常用典型的sql语句
1.两张表,怎么把一张表中的数据插入到另一张表中? 1,insert into table_a select * from table_b 2,insert into table_a(field_a1 ...
- 教你如何使用Java手写一个基于数组实现的队列
一.概述 队列,又称为伫列(queue),是先进先出(FIFO, First-In-First-Out)的线性表.在具体应用中通常用链表或者数组来实现.队列只允许在后端(称为rear)进行插入操作,在 ...