2020.10.30 使用OpenCV进行图像对比度及亮度修改 【OpenCV C++】

源代码:

// testOpencv06.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main()
{
    //std::cout << "Hello World!\n";

    Mat src = imread("E:/imageSources/3.jpg");

    //转化为灰度图像
    cvtColor(src, src, COLOR_BGR2GRAY);

    if (!src.data) {
        printf("can not load image");
        return -1;
    }

    char inputWindowName[] = "input window";
    namedWindow(inputWindowName,WINDOW_AUTOSIZE);
    imshow(inputWindowName,src);
   
    Mat dst = Mat::zeros(src.size(), src.type());
    //将图像格式转化为float类型的,才可以后面取float类型的数据进行计算
    Mat m1;
    src.convertTo(m1,CV_32F);

    int imageHeight = m1.rows;
    int imageWidth = m1.cols;
    int imageChannels = m1.channels();

    //调节对比度以及亮度参数
    float alpha = 1.5;//调节对比度
    float beta = -100;//调节亮度

    for (int row = 0; row < imageHeight; row++){
        for (int col = 0; col < imageWidth; col++)
        {
            //判断图像通道数,通道不同处理方式不同
            if (imageChannels == 1) {
                //float gray = src.at<uchar>(row, col);
                float gray = m1.at<float>(row, col);
                dst.at<uchar>(row, col) = saturate_cast<uchar>(alpha * gray + beta);
              
            }
            else if (imageChannels == 3) {

                //float b = src.at<Vec3b>(row, col)[0];
                //float g = src.at<Vec3b>(row, col)[1];
                //float r = src.at<Vec3b>(row, col)[2];

                //dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha * b + beta);
                //dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha * g + beta);
                //dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha * r + beta);

                //测试float数据
                float b = m1.at<Vec3f>(row, col)[0];
                float g = m1.at<Vec3f>(row, col)[1];
                float r = m1.at<Vec3f>(row, col)[2];

                dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(alpha * b + beta);
                dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(alpha * g + beta);
                dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(alpha * r + beta);
               
            }

        }
    }
    //输出处理后的图像
    char outputWindowName[] = "output window";
    namedWindow(outputWindowName, WINDOW_AUTOSIZE);
    imshow(outputWindowName, dst);


    waitKey(0);
    return 0;
}
 

处理结果对比图:

三通道彩色图像处理结果:

2020.10.30 使用OpenCV进行图像对比度及亮度修改 【OpenCV C++】

灰度图像处理结果:

2020.10.30 使用OpenCV进行图像对比度及亮度修改 【OpenCV C++】