split(img, channels); merge(channels, dst);

【OpenCV学习笔记】十二、图像的对比度和亮度调整及图像通道的分离与合并

标签: OpenCV 图像处理
 分类:

这一章讲了如下内容:

1.图像对比度及亮度调整

2.图像通道的分离与合并

先上ppt:

 

 

 

 

 

代码1:图像对比度与亮度调整

 

[cpp] view plain copy
 
  1. ///图像对比度调整与亮度调整  
[cpp] view plain copy
 
  1. //逻辑:遍历每个像素,对每个像素的每个通道进行g(i,j) = a*f(i,j)+b的操作。  
  2. //结合滑动条,两个滑动条的位置分别对应公式中a和b.注意溢出保护(saturate_cast方法)  
[cpp] view plain copy
 
  1. #include "opencv2/opencv.hpp"  
  2.   
  3. using namespace cv;  
  4.   
  5. #define WIN_NAME "输出图像" //宏定义  
  6. Mat srcImg;  
  7. Mat dstImg;  
  8. int Contrase_Value = 20;  
  9. int Bright_Value = 20;  
  10.   
  11. void OnChange(int, void*)  
  12. {  
  13.     for (int i = 0; i < srcImg.rows; i++)  
  14.     {  
  15.         for (int j = 0; j < srcImg.cols; j++)  
  16.         {  
  17.             dstImg.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[0] + Bright_Value);  
  18.             dstImg.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[1] + Bright_Value);  
  19.             dstImg.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[2] + Bright_Value);  
  20.         }  
  21.     }  
  22.     //定义“原图”窗口,显示原图,CV_WINDOW_NORMAL:正常大小显示,用户可改变大小窗口  
  23.     namedWindow("原图", CV_WINDOW_NORMAL);  
  24.         imshow("原图", srcImg);  
  25.     imshow(WIN_NAME, dstImg);  
  26. }  
  27.   
  28. void main()  
  29. {  
  30.     srcImg = imread("1.jpg");  
  31.     dstImg = Mat::zeros(srcImg.size(), srcImg.type());  
  32.     //Mat::zeros(); //将矩阵元素都置为0  
  33.     //Mat::ones(); //将矩阵元素都置为1  
  34.     //定义WIN_NAME窗口,显示输出图像,CV_WINDOW_NORMAL:正常大小显示,用户可改变大小窗口  
  35.     namedWindow(WIN_NAME, CV_WINDOW_NORMAL);  
  36.   
  37.     //定义调整对比度的滑动条  
  38.     createTrackbar("对比度", WIN_NAME, &Contrase_Value, 300, OnChange, 0);  
  39.     //定义调整亮度的滑动条  
  40.     //同对比度滑动条依附于同一个窗口,且共用一个OnChange函数  
  41.     createTrackbar("亮   度", WIN_NAME, &Bright_Value, 200, OnChange, 0);  
  42.   
  43.     OnChange(Contrase_Value, 0); //回调函数初始化(使得WIN_NAME窗口一开始就有图像)  
  44.     OnChange(Bright_Value, 0);  
  45.   
  46.     waitKey(0);  
  47. }  

 

运行结果:

 

代码2:图像通道分离与合并

 

[cpp] view plain copy
 
  1. ///图像通道分离与合并  
[cpp] view plain copy
 
  1. //通道分离(split函数),通道合并(merge函数)  
[cpp] view plain copy
 
  1. #include "opencv2/opencv.hpp"  
  2.   
  3. using namespace cv;  
  4.   
  5. void main()  
  6. {  
  7.     Mat img = imread("2.jpg");  
  8.     Mat dst;  
  9.     vector<Mat> channels;  
  10.   
  11.     //通道分离,将图像通道分离存入Mat类型的vector容器channels中  
  12.     split(img, channels);  
  13.     Mat blueChannel = channels.at(0);//同channels[0]  
  14.     Mat greenChannel = channels.at(1);  
  15.     Mat redChannel = channels.at(2);  
  16.   
  17.     //imshow("blue", blueChannel);  
  18.     //imshow("green", greenChannel);  
  19.     //imshow("red", redChannel);  
  20.       
  21.     //通道合并,将channels中图像的三个通道,合并进图像dst中,dst同原图一样.  
  22.     merge(channels, dst);  
  23.   
  24.     imshow("dst", dst);  
  25.       
  26.     waitKey(0);  
  27. }  

 

运行结果:

 

 

#include "opencv2/opencv.hpp"  

using namespace cv;  

void main()  
{  
    Mat img = imread("lena.jpg");  
    Mat dst;  
    vector<Mat> channels;  

    //通道分离,将图像通道分离存入Mat类型的vector容器channels中  
    split(img, channels);  
    Mat blueChannel = channels.at(0);//同channels[0]  
    Mat greenChannel = channels.at(1);  
    Mat redChannel = channels.at(2);  

    //imshow("blue", blueChannel);  
    //imshow("green", greenChannel);  
    //imshow("red", redChannel);  

    //通道合并,将channels中图像的三个通道,合并进图像dst中,dst同原图一样.  
    merge(channels, dst);
    imshow("dst", dst);
    waitKey(0);
    vector<Mat> channels2;  
    channels2.push_back(redChannel);
    channels2.push_back(greenChannel);
    channels2.push_back(blueChannel);
    merge(channels2, dst);  
    imshow("dst", dst);




    waitKey(0);  
}

 

posted @ 2018-03-26 11:28  sky20080101  阅读(501)  评论(0)    收藏  举报