今天呢,我们一起学习一下,如何调整图像的对比度以及亮度。
一、原理
调整图像亮度与对比度所用的公式
g(i,j) = a * f(i,j) + b
其中,i 和 j 表示像素位于第i行 和 第j列 。
-
参数f(i,j)表示源图像像素。
-
参数g(i,j) 表示输出图像像素。
-
参数a(需要满足a>0)被称为增益(gain),常常被用来控制图像的对比度。
-
参数b通常被称为偏置(bias),常常被用来控制图像的亮度。
二、访问图像像素的方式
1、通过指针进行遍历
//使用ptr遍历Mat 变量mat是一幅图像
for (int row = 0; row < mat.rows; row++)
{
for (int col = 0; col < mat.cols; col++)
{
Vec3b *c = mat.ptr<Vec3b>(row, col);
c->val[0] = 0; //B
c->val[1] = 255; //G
c->val[2] = 0; //R
}
}
2、通过at方法遍历
try
{
//使用at来遍历
for (int row = 0; row < mat.rows; row++)
{
for (int col = 0; col < mat.cols; col++)
{
Vec3b &m = mat.at<Vec3b>(row, col);
m[0] = 100;
m[1] = 100;
m[2] = 100;
}
}
}
catch (Exception &ex)
{
cout << ex.what() << endl;
}
3、通过迭代器遍历
auto it = mat.begin<Vec3b>();
auto it_end = mat.end<Vec3b>();
for (; it != it_end; it++)
{
(*it).val[0] = 0; //B
(*it).val[1] = 0; //G
(*it).val[2] = 255; //R
}
为了访问图像的每一个像素,我们使用这样的语法: mat.at<Vec3b>(row,col)[c]
其中,row是像素所在的行, col是像素所在的列, c是R、G、B(对应0、1、2)其中之一。
二、图像对比度亮度调整实例
/////////////改变图像的对比度和亮度/////////////////////////////////////
///@para a float 对比度 1.0~3.0
///@para b int 亮度 0~100
void ChangeGain(Mat &src, Mat &des, float a, int b)
{
//g(r,c) = a*f(r,c) + b
des.create(src.rows, src.cols, src.type());
for (int r = 0; r < src.rows; r++)
{
for (int c = 0; c < src.cols; c++)
{
for (int i = 0; i < 3; i++)
{
des.at<Vec3b>(r, c)[i] =
saturate_cast<uchar>(a * src.at<Vec3b>(r, c)[i] + b);
}
}
}
}
因为我们的运算结果可能超出像素取值范围(溢出),还可能是非整数(如果是浮点数的话),所以我们要用saturate_cast对结果进行转换,以确保它为有效值。
实例:
头文件、变量、函数声明 调整图像对比度与亮度 main函数调用好了,今天的OpenCV学到这里就结束了,喜欢的朋友可以给我点个赞哦!!!
网友评论