对比度调整:是在原来图像基础上进行相应的公式调整,是类似乘法操作,本身像数值越大,对比度增加之后其与低像素点值差距越大,导致对比增强
项目最终效果:通过滚动条trackbar来实现调整图片亮度的功能
我这里创建的项目为:track_bar_contrast
一、创建滚动条调整图像对比度——头文件
在项目的头文件中,右击添加,新建项
创建用于滚动条调整图像亮度的头文件,我这边是track_bar.h
该头文件声明了一个TrackBar类(class TrackBar
),该类下面声明一个函数(void track_bar(Mat& image)
)
track_bar.h
头文件内容如下:
#pragma once
#include<opencv2/opencv.hpp>
using namespace cv;
class TrackBar {
public:
void track_bar(Mat&image);
};
二、创建滚动条调整图像亮度——函数实现
创建个文件,用于实现头文件中TrackBar类中的track_bar函数
我这个文件是:trackbar_finish.cpp
#include"track_bar.h"
,导入自定义的头文件
Mat hjj, result, src;
hjj负责每次改变像数值
result用于存放改变之后的图像
src原始图像
createTrackbar("contrast:", "contrast_change", &init_contrast, max_value, on_contrast, (void*)(&image));
参数一:起个名称而已,用于滚动条显示的字符串
参数二:窗口名称
参数三:起始的位置
参数四:滚动条的最大值
参数五:自定义响应事件函数
参数六:传参
事件响应函数on_contrast
hjj = Scalar(init_light, init_light, init_light);
,自定义每次要改变的像素点值
addWeighted(src, alpha, hjj, 0.0, 0, result);
公式:result = src1 * alpha + src2 * beta + gamma
其中src1为原始图src,alpha为一个double类型数据,src2为另一个图像数据这里为hjj全零的同规格图像,beta为0.0,gamma为0,最终的结果为result
基于博文:六、滚动条操作——调整图像亮度的改进版
改进版,传参实现
#include"track_bar.h"
#include <iostream>
#include <opencv2/opencv.hpp>
Mat hjj, result, src;
int max_value = 500, init_contrast = 150;
static void on_contrast(int init_light, void* userdata) {
double alpha = init_light / 100.0;
Mat src = *((Mat*)userdata);
hjj = Scalar(init_light, init_light, init_light);
addWeighted(src, alpha, hjj, 0.0, 0, result);
imshow("contrast_change", result);
}
void TrackBar::track_bar(Mat& image) {
namedWindow("contrast_change", WINDOW_AUTOSIZE);
hjj = Mat::zeros(image.size(), image.type());
result = Mat::zeros(image.size(), image.type());
src = image;
createTrackbar("contrast:", "contrast_change", &init_contrast, max_value, on_contrast, (void*)(&image));
on_contrast(150, &image);
}
三、创建滚动条调整图像亮度— —主函数
同理,创建一个cpp文件,我这里以yy_main.cpp
为例,作为程序执行入口,调用所实现的方法。
#include <opencv2/opencv.hpp>
#include <iostream>
#include "track_bar.h"
using namespace cv;
using namespace std;
int main(int argc, char** argv) {
Mat src = cv::imread("E:/C++_workspace/beyond.jpg", IMREAD_COLOR);
if (src.empty()) {
printf("load image is false...\n");
return -1;
}
namedWindow("yanyu", WINDOW_FREERATIO);
imshow("yanyu", src);
TrackBar yy;
yy.track_bar(src);
waitKey(0);
destroyAllWindows();
return 0;
}
项目结构如图所示:
运行效果如图所示: