您的位置:首页 > 运维架构

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

2017-05-03 20:47 375 查看

对比度亮度调整

原理

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();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: