您的位置:首页 > 运维架构

opencv学习(十)之调节图像亮度和对比度

2016-11-21 21:28 387 查看
在图像处理中,图像像素的值依赖于输入图像的值。可以通过对输入像素值进行数值运算已达到对图像处理的目的。以调节图像对比度和亮度为例,通过结合之前学过的图像像素访问和轨迹条等内容,对图像对比度和亮度进行调节。

以f(i,j)代表原像素值,g(i,j)为输出像素的值,α和β为两个参数,则可以通过以下公式对图像像素值进行数值运算从而达到调节图像亮度和对比度的目的。

g(i,j)= αf(i,j)+ β


其中参数α>0和β常被称为增益和偏置参数,有时这些参数可以调节图像的对比度和亮度。其中i,j分别代表了该像素的行和列。

#include <iostream>
#include <stdio.h>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace std;
using namespace cv;

//定义全局变量
Mat g_SrcImage, g_DstImage;
const int g_nAlphaTrackbarMaxValue = 30;    //滑动条最大值
const int g_nBetaTrackbarMaxValue = 100;
int g_nAlphaTrackValue;                  //滑动条对比度对应值
int g_nBetaTrackValue;                   //滑动条亮度对应值
double g_dAlpahValue;
//double g_dBetaValue;

//声明回调函数
void on_AlphaTrackbar(int, void*);
void on_BetaTrackbar(int, void*);

int main()
{
g_SrcImage = imread("lena.jpg");

//判断图像是否加载成功
if(g_SrcImage.empty())
{
cout << "图像加载失败!" << endl << endl;
return -1;
}
else
cout << "图像加载成功!" << endl << endl;

namedWindow("原图像",WINDOW_AUTOSIZE);
imshow("原图像",g_SrcImage);

g_DstImage = Mat::zeros(g_SrcImage.size(),g_SrcImage.type());

namedWindow("图像调节",WINDOW_AUTOSIZE);          //声明轨迹条依附的窗口
g_nAlphaTrackValue = 10;                      //轨迹条中alpha初始值
g_nBetaTrackValue = 50;                       //轨迹条中beta初始值

//在创建的窗体中创建轨迹条并命名
char alphaTrackName[50];
char betaTrackName[50];
sprintf(alphaTrackName,"对比度 %d", g_nAlphaTrackbarMaxValue);
sprintf(betaTrackName,"亮 度 %d",g_nBetaTrackbarMaxValue);

//创建对比度调节和亮度调节的轨迹条
createTrackbar(alphaTrackName,"图像调节",&g_nAlphaTrackValue,g_nAlphaTrackbarMaxValue,on_AlphaTrackbar);
createTrackbar(betaTrackName,"图像调节",&g_nBetaTrackValue,g_nBetaTrackbarMaxValue,on_BetaTrackbar);

//调用回调函数
on_AlphaTrackbar(g_nAlphaTrackValue, 0);
on_BetaTrackbar(g_nBetaTrackValue, 0);

waitKey(0);

return 0;
}

void on_AlphaTrackbar(int, void*)
{
g_dAlpahValue = (double)g_nAlphaTrackValue / 10;
for(int y = 0; y < g_DstImage.rows; y++)
{
for(int x = 0; x < g_DstImage.cols; x++)
{
for(int c = 0; c < 3; c++)
{
g_DstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>(g_dAlpahValue *
(g_SrcImage.at<Vec3b>(y, x)[c]));
}
}
}
imshow("图像调节",g_DstImage);
}

void on_BetaTrackbar(int, void*)
{
for(int y = 0; y < g_DstImage.rows; y++)
{
for(int x = 0; x < g_DstImage.cols; x++)
{
for(int c = 0; c < 3; c++)
{
g_DstImage.at<Vec3b>(y, x)[c] = saturate_cast<uchar>((g_SrcImage.at<Vec3b>(y, x)[c]) +
g_nBetaTrackValue);
}
}
}
imshow("图像调节",g_DstImage);
}


程序运行结果如下所示:



程序分析:

* 在上述程序中用alpha和beta分别替代上文中提到的α和β两个参数。

* 使用Mat::zeros()方法初始化目标图像矩阵,与原图像大小和类型相同

* 使用at()函数对图像像素值进行遍历

* 图像为三通道图像,故使用结构存储每个通道所对应的像素值

* 在计算像素值时使用saturate_cast来防止计算出来的图像像素值溢出
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息