本篇文章为大家展示了C++ 中怎么利用OpenCV实现线性混合操作,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
目前创新互联公司已为上1000+的企业提供了网站建设、域名、网站空间、绵阳服务器托管、企业网站设计、曾都网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
线性混合操作
即可以把两张图像混合成一张图像的操作.
图像线性混合的数学原理
G(x)=(1-a)F(x)+aQ(x)
注意事项:
1,a的取值范围为0到1之间
2,F(x)和Q(x)为参与混合的两幅图像,G(x)表示输出图像
3,通过对两幅图像的每个像素值做线性加权得到最终的输出图像
4,两幅图像的大小和类型必须完全一致,如果把图像当成一个矩阵
则两个矩阵相加的前提是维度必须一致,否则没有相加的意义。
addWeighted函数
在OpenCV中用于线性混合操作的API为addWeighted函数
void
addWeighted(InputArray src1,
double
alpha, InputArray src2,
double
beta,
double
gamma, OutputArray dst,
int
dtype=-1);
第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
第二个参数,alpha,表示第一个数组的权重
第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数,beta,表示第二个数组的权重值。
第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
代码演示
新建项目
新建一个项目opencv-0006,配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法.
加载图片
然后我们加载图像用于显示出来,我们这次需要两个数据源,所以加载了两张图像
然后我们显示一下看看效果
OK,显示图片没有问题。
addWeighted线性混合操作
我们在操作addWeighted的时候,两个数据源必须是相同大小的图像,所以我在们操作之前先输出一个下看看两个图像的高度和宽度是否一致.
运行后发现两个图像的宽度差了一个,那在执行addweighted的时候肯定会报错了.所以我们要加一行调整的代码,如果判断宽度和高度有一个不一致,那就把第二个图像按第一个图像的大小进行缩放
图像缩放的API为resize
CV_EXPORTS_W void resize( InputArray src, OutputArray dst,
Size dsize, double fx=0, double fy=0,
int interpolation=INTER_LINEAR );
接下来我们加入缩放的判断,把src2的图像转换成src1的大小
这样我们就可以进行线性混合操作了
其中定义的alpha就是两个图像的权重,我们用了0.5比重,第二个图像就要用到1-0.5效果了,就是说两个比重加起来要等于1.
我们看一下显示效果
中间的图像就是我们通过线性混合操作生成的图片,接下来我们改一下权重,看看显示的效果.
将第一个图像的权重改为0.2,显示的效果为
明显可以看出第二张图显示的比较清晰.
我们再把第一个图的权重改为0.7
上述内容就是C++ 中怎么利用OpenCV实现线性混合操作,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。