zoukankan      html  css  js  c++  java
  • 跟我一起学opencv 第五课之调整图像亮度和对比度

    一.调整图像亮度与对比度

    1.图像变换

    ---像素变换-点操作

    ---邻域操作-区域操作

    调整图像亮度和对比度属于像素变换-点操作

    公式为:g(i,j) = αf(i,j) + β 其中α>0 ,β是增益变量

    处理图像经常会对图像色彩进行增强,这就是改变图像的亮度β和对比度α,

    我们看看实例代码:

     1 #include<opencv2opencv.hpp>
     2 #include<iostream>
     3 
     4 using namespace std;
     5 using namespace cv;
     6 /*图像操作*/
     7 int main(int argc, char **argv)
     8 {
     9     Mat src1 = imread("E:\vsprom\learn05\v15.jpg");
    10     
    11     if (src1.empty())
    12     {
    13         cout << "can not load imagefile1...." << endl;
    14         return -1;
    15     }
    16     namedWindow("in1 image win", CV_WINDOW_AUTOSIZE);
    17     imshow("in1 image win", src1);
    18 
    19     int height = src1.rows;
    20     int width = src1.cols;
    21 
    22     Mat dst = Mat::zeros(src1.size(), src1.type());//创建一副与src1同样的图像,并将像素值全部给0
    23     float alpha = 1.2;
    24     float beta = 30;
    25     for (int row = 0; row < height; row++)
    26     {
    27         for (int col = 0; col < width; col++)
    28         {
    29             if (src1.channels() == 3)//三通道图像
    30             {
    31                 float b = src1.at<Vec3b>(row, col)[0];//通道1
    32                 float g = src1.at<Vec3b>(row, col)[1];//通道2
    33                 float r = src1.at<Vec3b>(row, col)[2];//通道3
    34 
    35                 dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);//使用公式
    36                 dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
    37                 dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
    38 
    39             }
    40             else if (src1.channels() == 1)//单通道图像
    41             {
    42                 float v = src1.at<uchar>(row, col);
    43                 dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
    44             }
    45         }
    46     }
    47     namedWindow("dst image win", CV_WINDOW_AUTOSIZE);
    48     imshow("dst image win", dst);
    49 
    50 
    51     waitKey(0);
    52     return 0;
    53 }

    效果如下此时α=1.2,β=30

    效果如下α=1.2,β=100时,此时更亮

    效果如下α=5,β=30时,对比更明显

    转换图像格式:

    src2.convertTo(src1, CV_32F);

    代码为:

    #include<opencv2opencv.hpp>
    #include<iostream>
    
    using namespace std;
    using namespace cv;
    /*图像操作*/
    int main(int argc, char **argv)
    {
        Mat src2 = imread("E:\vsprom\learn05\v15.jpg");
        
        if (src2.empty())
        {
            cout << "can not load imagefile1...." << endl;
            return -1;
        }
        namedWindow("in1 image win", CV_WINDOW_AUTOSIZE);
        imshow("in1 image win", src2);
    
        Mat src1;
        src2.convertTo(src1, CV_32F);
    
        int height = src1.rows;
        int width = src1.cols;
    
        Mat dst = Mat::zeros(src2.size(), src2.type());//创建一副与src1同样的图像,并将像素值全部给0
        float alpha = 1.2;
        float beta = 30;
        for (int row = 0; row < height; row++)
        {
            for (int col = 0; col < width; col++)
            {
                if (src1.channels() == 3)//三通道图像
                {
                    float b = src1.at<Vec3f>(row, col)[0];//通道1
                    float g = src1.at<Vec3f>(row, col)[1];//通道2
                    float r = src1.at<Vec3f>(row, col)[2];//通道3
                    //修改像素值
                    dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta);
                    dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta);
                    dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta);
    
                }
                else if (src1.channels() == 1)//单通道图像
                {
                    float v = src1.at<uchar>(row, col);
                    dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
                }
            }
        }
        namedWindow("dst image win", CV_WINDOW_AUTOSIZE);
        imshow("dst image win", dst);
    
    
        waitKey(0);
        return 0;
    }

    效果图:

  • 相关阅读:
    03-链表
    23-自定义用户模型
    01-使用pipenv管理项目环境
    10-多线程、多进程和线程池编程
    17-Python执行JS代码--PyExecJS、PyV8、Js2Py
    09-Python-Socket编程
    08-迭代器和生成器
    07-元类编程
    06-对象引用、可变性和垃圾回收
    05-深入python的set和dict
  • 原文地址:https://www.cnblogs.com/huipengbo/p/10781029.html
Copyright © 2011-2022 走看看