opencv(10)---对比度亮度调整与通道分离与合并

来源:互联网 发布:域名备案 坏处 编辑:程序博客网 时间:2024/06/02 02:10

对比度亮度调整

原理

g(x)=a*f(x)+b;

其中,a用于控制对比度,b用于控制亮度

代码

#include "mainwindow.h"#include <QApplication>#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;#define WIN_NAME "输出图像"Mat srcImg;Mat dstImg;int Contrase_Value = 20;int Bright_Value = 20;void OnChange(int, void*){    for(int i = 0; i<srcImg.rows; i++)    {        for(int j = 0; j<srcImg.cols; j++)        {            dstImg.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[0] + Bright_Value);            dstImg.at<Vec3b>(i, j)[1] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[1] + Bright_Value);            dstImg.at<Vec3b>(i, j)[2] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[2] + Bright_Value);        }    }    imshow("原图", srcImg);    imshow(WIN_NAME, dstImg);}int main(int argc, char *argv[]){    QApplication a(argc, argv);    srcImg = imread("D:\\LearningOpenCV\\Lesson12\\1.jpg");    if(srcImg.empty()){        return 0;    }    dstImg = Mat::zeros(srcImg.size(), srcImg.type());    namedWindow(WIN_NAME, CV_WINDOW_AUTOSIZE);    createTrackbar("contrase_value", WIN_NAME, &Contrase_Value, 300, OnChange, 0);    createTrackbar("Bright_value", WIN_NAME, &Bright_Value, 200, OnChange, 0);    OnChange(Contrase_Value, 0); //回调函数初始化    OnChange(Bright_Value, 0);    waitKey(0);    return a.exec();}

知识点讲解

1.ones
用于初始化一个固定大小和类型且初始化所有值都为1的矩阵

dstImg=Mat::ones(srcImg.size(),srcImg.type());

2. zeros
用于初始化一个固定大小和类型且初始化所有值都为0的矩阵

 dstImg = Mat::zeros(srcImg.size(), srcImg.type());

3.onChange
下面的代码用于初始化

OnChange(Contrase_Value, 0); //回调函数初始化OnChange(Bright_Value, 0);

4. saturate_cast
该函数用于限定取值范围
相当于下列代码

//溢出保护if(data<0)    data=0;else if(data>255)    data=255;

用法

 dstImg.at<Vec3b>(i, j)[0] = saturate_cast<uchar>(Contrase_Value * 0.01 * srcImg.at<Vec3b>(i, j)[0] + Bright_Value);

通道分离—-split

通道分离以后的图像为灰度图,图像某位置越白,说明灰度值越大,说明原图中某一通道的值越大

代码

#include "mainwindow.h"#include <QApplication>#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;int main(int argc, char *argv[]){    QApplication a(argc, argv);    Mat img=imread("D:\\1\\1.png");    if(img.empty()){        cout<<"error this image!"<<endl;        return 0;    }    vector<Mat> channels;    Mat blueChannel=channels.at(0);    Mat greenChannel=channels.at(1);    Mat redChannel=channels.at(2);    imshow("originalImage",img);    imshow("blueChannel",blueChannel);    imshow("greenChannel",greenChannel);    imshow("redChannel",redChannel);    return a.exec();}

知识点讲解

黄色是由绿色和红色通道进行叠加的。所以,原图中显示为黄色的地方,在绿色通道和红色通道中都是显示为白色的。

通道合并

#include "mainwindow.h"#include <QApplication>#include <opencv2/opencv.hpp>#include <iostream>using namespace std;using namespace cv;int main(int argc, char *argv[]){    QApplication a(argc, argv);    Mat img=imread("D:\\1\\1.png");    Mat dstImage;    if(img.empty()){        cout<<"error this image!"<<endl;        return 0;    }    vector<Mat> channels;    Mat blueChannel=channels.at(0);    Mat greenChannel=channels.at(1);    Mat redChannel=channels.at(2);    imshow("originalImage",img);    imshow("blueChannel",blueChannel);    imshow("greenChannel",greenChannel);    imshow("redChannel",redChannel);    //合并通道    merge(channels,dstImage);    return a.exec();}
0 0
原创粉丝点击