跟我一起学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语 ...
随机推荐
- genymotion中app不能安装问题
在安装app时弹出如下图报错. 官网解释:Genymotion模拟器使用的是x86架构,在第三方市场上的应用有部分不采用x86这么一种架构,所以在编译的时候不通过,报“APP not installe ...
- thinter中combobox下拉选择控件(九)
combobox控件,下拉菜单控件 combobox控件在tkinter中的ttk下 简单的实现下: import tkinter from tkinter import ttk # 导入ttk模块, ...
- Android 不规则图像填充 小玩着色游戏
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45788433: 本文出自:[张鸿洋的博客] 一.概述 近期群里偶然看到一哥们在 ...
- ResultSet,RowSet,OracleCachedRowSet和RowSetMetaData区别及联系
在java主要涉及到数据开发的过程中,我们会和数据库打交道很多,其中使用了数据集比如ResultSet和RowSet,经常使用两种,还有其它的一些,那么这两种的主要区别是什么呢?我们先来看它们引入的方 ...
- compress.go
The Gorilla Authors. All rights reserved. // Use of this source code is governed by a BSD-style // l ...
- bzoj 2002 弹飞绵羊 分块
正解lct,然而本蒟蒻并不会.... 分块思路很清晰,处理出每个点弹出所在块所需要的步数及出去后的第一个位置 #include<cstdio> #include<cstring> ...
- BZOJ_2622_[2012国家集训队测试]深入虎穴_最短路
BZOJ_2622_[2012国家集训队测试]深入虎穴_最短路 Description 虎是中国传统文化中一个独特的意象.我们既会把老虎的形象用到喜庆的节日装饰画上,也可能把它视作一种邪恶的可怕的动物 ...
- 硬木地板 JDFZ1667
Description 举行计算机科学家盛宴的大厅的地板为M×N (1<=M<=9, 1<=N<=9)的矩形.现在必须要铺上硬木地板砖.可以使用的地板砖形状有两种:1) 2×1 ...
- netcore 获取本地网络IP地址
.net framework 下面可以用下面的代码获取到本地网络ip地址.netcore下面这个代码也依然可以用 System.Net.Dns.GetHostName() System.Net.Dns ...
- TCP报文解析
概述 在<网络基础总结(一)>总结了TCP建立连接和断开连接的流程,然而TCP协议远比我所了解的复杂得多,我所知的可以说就冰山一角,所总结的也只是纸上谈兵,仅仅只能对TCP有个肤浅的认识, ...