Goal
In this tutorial you will learn:
- what is linear blending and why it is useful;
- how to add two images using cv::addWeighted
Theory
- Note
- The explanation below belongs to the book Computer Vision: Algorithms and Applications by Richard Szeliski
From our previous tutorial, we know already a bit of Pixel operators. An interesting dyadic (two-input) operator is the linear blend operator:
\[g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)\]
By varying \(\alpha\) from \(0 \rightarrow 1\) this operator can be used to perform a temporal cross-dissolve between two images or videos, as seen in slide shows and film productions (cool, eh?)
Source Code
Download the source code from here.
#include <iostream>
int main( void )
{
double alpha = 0.5; double beta; double input;
std::cout<<" Simple Linear Blender "<<std::endl;
std::cout<<"-----------------------"<<std::endl;
std::cout<<"* Enter alpha [0-1]: ";
std::cin>>input;
if( alpha >= 0 && alpha <= 1 )
{ alpha = input; }
src1 =
imread(
"../data/LinuxLogo.jpg");
src2 =
imread(
"../data/WindowsLogo.jpg");
if( src1.
empty() ) { std::cout<<
"Error loading src1"<<std::endl;
return -1; }
if( src2.
empty() ) { std::cout<<
"Error loading src2"<<std::endl;
return -1; }
beta = ( 1.0 - alpha );
imshow(
"Linear Blend", dst );
return 0;
}
Explanation
Since we are going to perform:
\[g(x) = (1 - \alpha)f_{0}(x) + \alpha f_{1}(x)\]
We need two source images ( \(f_{0}(x)\) and \(f_{1}(x)\)). So, we load them in the usual way:
src1 =
imread(
"../data/LinuxLogo.jpg");
src2 =
imread(
"../data/WindowsLogo.jpg");
warning
Since we are adding src1 and src2, they both have to be of the same size (width and height) and type.
- Now we need to generate the
g(x)
image. For this, the function cv::addWeighted comes quite handy: since cv::addWeighted produces:
\[dst = \alpha \cdot src1 + \beta \cdot src2 + \gamma\]
In this case, gamma
is the argument \(0.0\) in the code above.
- Create windows, show the images and wait for the user to end the program.
imshow(
"Linear Blend", dst );
Result