一、addWeighted函数
Weight [ˈweɪt] 权重。通过改变权重使两个Mat融合在一起
void addWeighted(InputArray src1, double alpha,
InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)
第一个参数:InputArray src1,表示需要加权的第一个数组,常常填一个Mat
第二个参数:double alpha,表示第一个数组的权重
第三个参数:InputArray src2,表示第二个数组,需要和第一个数组拥有相同的尺寸和通道数
第四个参数:double beta,第二个数组的权重值,值为1-alpha
第五个参数:double gamma,一个加到权重总和上的标量值。
第六个参数:OutputArray dst,输出的数组,和输入的两个数组拥有相同的尺寸和通道数
dst = src1[I] * alpha + src2[I] * beta + gamma
第七个参数:int dtype,输出阵列的可选深度,有默认值-1。当两个输入数组具有相同深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
二、注意事项
alpha 相当于增加图像的对比度,gamma相当于增加图像的亮度。
执行addWeighted函数相当于是对其中的一个图像执行下面的操作 对每个像素乘alpha再加beta,但不能超过255 所以要用saturate_cast<uchar>
/// 执行运算 new_image(i,j) = alpha*image(i,j) + beta
for( int y = 0; y < image.rows; y++ )
{
for( int x = 0; x < image.cols; x++ )
{
for( int c = 0; c < 3; c++ )
{
new_image.at<Vec3b>(y,x)[c] = saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta );
}
}
}
三、示例代码
1、利用addWeighted融合两个不同的图像。
Mat m1 = imread("axlix.jpg");
Mat m2 = imread("axlix2.jpg");
if (m1.empty() || m2.data == 0) {
cout << "文件打不开" << endl;
}
if (m1.size() != m2.size()) {
cout << "两幅图尺寸不一样" << m1.size()<<" ---" << m2.size() << endl;
resize(m2, m2, m1.size());
}
Mat mo = Mat(m1.size(), m1.type());
addWeighted(m1, 0.8, m2, 0.6, 50, mo);
imshow("mo", mo);
2、利用addWeighted设置图像的亮度和对比度。
其中alpha beta是图像的对比度 gamma是亮度
void myCV:: addWeightedtest()是myCV类的成员函数, static void on_lightness(int b, void* userdata)和 static void on_contractness(int b, void* userdata)都设置为静态方法,不属于myCV类。
static void on_lightness(int b, void* userdata) {
Mat image = *((Mat*)userdata);
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
addWeighted(image, 1.0, m, 0.0, (b-50)*2, dst);
imshow("亮度对比度调整", dst);
}
static void on_contractness(int b, void* userdata) {
Mat image = *((Mat*)userdata);
Mat dst = Mat::zeros(image.size(), image.type());
Mat m = Mat::zeros(image.size(), image.type());
double contrastv = b / 100.0;
addWeighted(image, contrastv, m, 0.0, 0, dst);
imshow("亮度对比度调整", dst);
}
void myCV::addWeightedtest()
{
namedWindow("亮度对比度调整", WINDOW_AUTOSIZE);
static Mat src = imread("axlix.jpg");
int value = 50;
int contractvalue = 100;
int maxvalue = 100;
int maxvalue2 = 200;
createTrackbar("亮度调整:", "亮度对比度调整", &value, maxvalue, on_lightness, &src);
createTrackbar("对比度调整:", "亮度对比度调整", &contractvalue, 200, on_contractness, &src);
}
四、在改变亮度和对比度的作用上相当于convertTo这个函数
src.convertTo(src, src.type(), 2.0, 50);