Opencv学习笔记4:Opencv处理调整图片亮度和对比度
一、理论基础
在数学中我们学过线性理论,在图像亮度和对比度调节中同样适用,看下面这个公式:
在图像像素中其中:
- 参数f(x)表示源图像像素。
- 参数g(x) 表示输出图像像素。
- 参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度。
- 参数b通常被称为偏置(bias),常常被用来控制图像的亮度。
二、获取图像像素
在opencv中图像数据是存放在Mat数据类型中,我们知道一个像素有rgb构成,所以Mat是个三维数组,一下就是简单的获取mat中图像像素。
//三个for循环,执行运算 new_image(i,j) =a*image(i,j) + b
for(int y = ; y < image.rows; y++ )
{
for(int x = ; x < image.cols; x++ )
{
for(int c = ; c < ; c++ )
{
new_image.at<Vec3b>(y,x)[c]= saturate_cast<uchar>( (g_nContrastValue*0.01)*(image.at<Vec3b>(y,x)[c] ) + g_nBrightValue );
}
}
}
上述代码中image.at<Vec3b>(y,x)[c] 其中,y是像素所在的行, x是像素所在的列, c是R、G、B(对应0、1、2)其中之一。
saturate_cast为了安全转换,运算结果可能超出像素取值范围(溢出),还可能是非整数(如果是浮点数的话),用saturate_cast对结果进行转换,以确保它为有效值。
效果图:

三、实例
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp" using namespace std;
using namespace cv; static void ContrastAndBright(int, void *);
int g_nContrastValue; //对比度值
int g_nBrightValue; //亮度值
Mat g_srcImage, g_dstImage; int main()
{
// 读入用户提供的图像
g_srcImage = imread("0004.bmp"); g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type()); //设定对比度和亮度的初值
g_nContrastValue = ;
g_nBrightValue = ; //创建窗口
namedWindow("【效果图窗口】", ); //创建轨迹条
createTrackbar("对比度:", "【效果图窗口】", &g_nContrastValue, , ContrastAndBright);
createTrackbar("亮 度:", "【效果图窗口】", &g_nBrightValue, , ContrastAndBright); //调用回调函数
ContrastAndBright(g_nContrastValue, );
ContrastAndBright(g_nBrightValue, ); waitKey();
//输出一些帮助信息
return ;
} //-----------------------------【ContrastAndBright( )函数】------------------------------------
// 描述:改变图像对比度和亮度值的回调函数
//-----------------------------------------------------------------------------------------------
static void ContrastAndBright(int, void *)
{
// 三个for循环,执行运算 g_dstImage(i,j) = a*g_srcImage(i,j) + b
for (int y = ; y < g_srcImage.rows; y++)
{
for (int x = ; x < g_srcImage.cols; x++)
{
for (int c = ; c < ; c++)
{
g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
}
}
}
// 显示图像
imshow("【原始图窗口】", g_srcImage);
imshow("【效果图窗口】", g_dstImage);
}
注意:
saturate_cast:
功能:防止数据溢出,因为无论是加是减,乘除,都会超出一个像素灰度值的范围(0~255)。所以,所以当运算完之后,结果为负,则转为0,结果超出255,则为255。
四、改进
这样已经完成了更改亮度和对比度的需求,但是用for循环执行效率有点低,图像处理起来也不是特别流畅,opencv给出了非常合适的函数。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp" using namespace std;
using namespace cv; static void ContrastAndBright(int, void *);
int g_nContrastValue; //对比度值
int g_nBrightValue; //亮度值
Mat g_srcImage, g_dstImage; int main()
{
// 读入用户提供的图像
g_srcImage = imread("0004.bmp"); g_dstImage = Mat::zeros(g_srcImage.size(), g_srcImage.type()); //设定对比度和亮度的初值
g_nContrastValue = ;
g_nBrightValue = ; //创建窗口
namedWindow("【效果图窗口】", ); //创建轨迹条
createTrackbar("对比度:", "【效果图窗口】", &g_nContrastValue, , ContrastAndBright);
createTrackbar("亮 度:", "【效果图窗口】", &g_nBrightValue, , ContrastAndBright); //调用回调函数
ContrastAndBright(g_nContrastValue, );
ContrastAndBright(g_nBrightValue, ); waitKey();
//输出一些帮助信息
return ;
} //-----------------------------【ContrastAndBright( )函数】------------------------------------
// 描述:改变图像对比度和亮度值的回调函数
//-----------------------------------------------------------------------------------------------
static void ContrastAndBright(int, void *)
{
// 三个for循环,执行运算 g_dstImage(i,j) = a*g_srcImage(i,j) + b
//for (int y = 0; y < g_srcImage.rows; y++)
//{
// for (int x = 0; x < g_srcImage.cols; x++)
// {
// for (int c = 0; c < 3; c++)
// {
// g_dstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_nContrastValue*0.01)*(g_srcImage.at<Vec3b>(y, x)[c]) + g_nBrightValue);
// }
// }
//}
g_srcImage.convertTo(g_dstImage, -, g_nContrastValue*0.01, g_nBrightValue);
// 显示图像
imshow("【原始图窗口】", g_srcImage);
imshow("【效果图窗口】", g_dstImage);
}
Opencv学习笔记4:Opencv处理调整图片亮度和对比度的更多相关文章
- 第十七周 - OpenCV 学习笔记 S1 - OpenCV 基本函数
Imread()函数: 基本功能:读取图像到OpenCv中. 1.函数原型: Mat imwrite(const strings& filename, int flag = 1); 第一个参数 ...
- [OpenCV学习笔记1][OpenCV基本数据类型]
CvPoint基于二维整形坐标轴的点typedef struct CvPoint{int x; /* X 坐标, 通常以 0 为基点 */int y; /* y 坐标,通常以 0 为基点 */}CvP ...
- OpenCV学习笔记(12)——OpenCV中的轮廓
什么是轮廓 找轮廓.绘制轮廓等 1.什么是轮廓 轮廓可看做将连续的点(连着边界)连在一起的曲线,具有相同的颜色和灰度.轮廓在形态分析和物体的检测和识别中很有用. 为了更加准确,要使用二值化图像.在寻找 ...
- C#调整图片亮度和对比度
BitmapSource bitmap = null; ; ; private void SetBrightness(int degree) { degree = degree * / ; Write ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- 基础学习笔记之opencv(6):实现将图片生成视频
基础学习笔记之opencv(6):实现将图片生成视频 在做实验的过程中.难免会读视频中的图片用来处理,相反将处理好的图片又整理输出为一个视频文件也是非经常常使用的. 以下就来讲讲基于opencv的C+ ...
- 【opencv学习笔记七】访问图像中的像素与图像亮度对比度调整
今天我们来看一下如何访问图像的像素,以及如何改变图像的亮度与对比度. 在之前我们先来看一下图像矩阵数据的排列方式.我们以一个简单的矩阵来说明: 对单通道图像排列如下: 对于双通道图像排列如下: 那么对 ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
随机推荐
- PE结构详解
1 基本概念 下表描述了贯穿于本文中的一些概念: 名称 描述 地址 是“虚拟地址”而不是“物理地址”.为什么不是“物理地址”呢?因为数据在内存的位置经常在变,这样可以节省内存开支.避开错误的内存位置等 ...
- 如何开启mysql5.5的客户端服务 命令行打开方法
MySQL分为两个部分,服务器端和客户端,只有服务器端的服务开启后,才可以通过客户端登录到MySQL数据库.这里介绍如何用命令行方式开启mysql的客户端服务. 在计算机上安装好mysql软件 我 ...
- strcpy unsigned char
http://bbs.csdn.net/topics/250068243 char *strcpy(char* dest, const char *src); 用unsigned char编译会出错 ...
- jdbc一次性采集mysql和oracle的海量数据,5000W+为例
最近做的采集工具遇到采集一天数据(超过5000W行数据)的情况, 采集mysql的时候直接采用流式读取的方式可以一次全部都读取出来,速度的话取决于网络速度 stmt = conn.createStat ...
- Apache HBase Performance Tuning 官文总结
Apache HBase Performance Tuning RAM, RAM, RAM. 不要让HBase饿死. 请使用64位的平台 必须将swapping设定为0 使用本地硬件来完成hdfs的c ...
- python基础--hashlib模块
hashlib模块用于加密操作,代替了md5和sha模块, 主要提供SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法. # -*- coding:utf-8 - ...
- linux tomcat 突然验证码出不来
情况描述 虚拟机上用tomcat部署的web应用,本来都还可以的.后来打了一个快照进行过压缩后,重新起虚拟机发现应用登录界面的验证码出不来了,具体报的是500错误. 参见http://www.blog ...
- jersey中的405错误 method not allowed
- HDU 1054 Strategic Game(最小路径覆盖)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1054 题目大意:给你一棵树,选取树上最少的节点使得可以覆盖整棵树. 解题思路: 首先树肯定是二分图,因 ...
- Django API验证(令牌)
1. 获取接口信息 Client端 import requests import time import hashlib ctime = time.time() key = 'akfljakfjakl ...