互联网科技想法读书

OpenCV系列 --- 图像对比度、亮度值调整

2019-04-18  本文已影响21人  307656af5a04

今天呢,我们一起学习一下,如何调整图像的对比度以及亮度。

一、原理

调整图像亮度与对比度所用的公式
g(i,j) = a * f(i,j) + b
其中,i 和 j 表示像素位于第i行 和 第j列 。

二、访问图像像素的方式

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学到这里就结束了,喜欢的朋友可以给我点个赞哦!!!

上一篇下一篇

猜你喜欢

热点阅读