在文章滚动条调整图片亮度-CSDN博客中,我们实现了亮度的调整,同时我也作出了一些参数的改进:
static void on_track_light(int light_ness,void* p)
{
Mat image = *((Mat*)p);
Mat dst;
Mat m = Mat::zeros(image.size(),image.type());
m = Scalar(light_ness,light_ness,light_ness);
image.copyTo(dst);
// dst = dst + Scalar(light_ness,light_ness,light_ness);
// addWeighted(image,1,m,0,light_ness,dst);
addWeighted(image,1,m,1,0,dst);
imshow("adjust",dst);
}
createTrackbar("Light Value bar","adjust",&light_ness,max_light,on_track_light,(void*)(&image));
我们直接给回调函数image的地址,并在回调函数的定义中读取这个地址的图片,但是需要将void指针类型转换成Mat指针类型;这样就不需要在外面定义变量;同时也作出其他的改进;
首先,介绍一个函数addWeight()线性加权函数;
void addWeighted(
InputArray src1, double alpha,
InputArray src2, double beta,
double gamma, OutputArray dst, int dtype = -1);
计算 dst = src1*α + src2*β + γ
,一次完成加权相加与偏移。
实现亮度增加的两个途径:
1.dst = src1*1 + src2*1 + 0;src2可以是我们想加的亮度值:
static void on_track_light(int light_ness,void* p)
{
Mat image = *((Mat*)p);
Mat dst;
Mat m = Mat::zeros(image.size(),image.type());
m = Scalar(light_ness,light_ness,light_ness);
addWeighted(image,1,m,1,0,dst);
imshow("adjust",dst);
}
2.dst = src1*1 + src2*0 + γ;γ可以是我们想加的亮度值:
static void on_track_light(int light_ness,void* p)
{
Mat image = *((Mat*)p);
Mat dst;
Mat m = Mat::zeros(image.size(),image.type());
addWeighted(image,1,m,0,light_ness,dst);
imshow("adjust",dst);
}
实现对比度:把对比度映射到 0.1–3.0:dst = src1*α;
static void on_track_Contrast(int Contrast_ness,void* p)//对比度
{
Mat image = *((Mat*)p);
Mat dst;
double contrast = 0.1 + Contrast_ness * 2.9 / 100.0;
addWeighted(image,contrast,0,0,0,dst);
imshow("adjust",dst);
}
这里我们需要生成新的滑动值条;
void Demo::Tracking_Demo(Mat &image)
{
namedWindow("adjust",WINDOW_FREERATIO);
int max_light = 100;
int light_ness = 50;
int max_Contrast = 200;
int Contrast_ness = 50;
createTrackbar("Light Value bar","adjust",&light_ness,max_light,on_track_light,(void*)(&image));
createTrackbar("Contrast Value bar","adjust",&Contrast_ness,max_Contrast,on_track_Contrast,(void*)(&image));
}
当然,也要对比度的最大值max_Contrast以及初始值Contrast_ness,同样Contrast_ness可作为调整值;运行代码: