OpenCVForUnity(五)图像线性混合


前言

图片的融合在日常的图片的处理中算是比较常用的功能,这节课我们一起来学习一下他的工作机制和OpenCV给我们提供的接口。

如下图片我们可以看到两长图片你中有我,我中有你的效果:

在这里插入图片描述


核心理论讲解

其效果我们使用线性混合来实现。
我们知道图片的颜色主是由RGB值来决定的,值的范围是0~255.

当我们要融合两张图片时,则需要按一定比例来分配色值,但是需要注意的是无论怎么分配色值范围都在0~255之间。

那么我则需要一个比例α来控制,首先是α需要在0~1之间。
假设图片A的颜色占比为α时,则另张图片B则需要占比为(1-α) 如此才能确保总和为1.

表达为公式如下(线性混合):
在这里插入图片描述


实现代码讲解:

1、透明度控制

首先是控制对应的透明度
创建alpha和beta用于控制图片占用的比例,并使之总和为1.

float alpha = 0.5f;
float beta = (1.0f - alpha);

2、加载两张源图像:

使用Imgcodecs方式加载两张需要进行融合的图片。

string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/timg.jpg";
string readPath2 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/lena.jpg";
src1 = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
src2 = Imgcodecs.imread(Utils.getFilePath(readPath2), Imgcodecs.IMREAD_COLOR);

注意: 这里需要用到两图张图像,这两个图像的尺寸和类型都要一样.

3、进行融合

核心语句是通过Core.addWeighted方法来进行混合

Core.addWeighted(src1, alpha, src2, beta, 0, dst);

参数1:图片源1
参数2::图片源1透明度
参数3:图片源2
参数4:图片源2透明度
参数5:加到标量的和
参数6:混合结果容器

4、色彩模式转换

由于Mat读取图片后储存方式为 BGR,.因而需要转为 RGB
为了节省性能可以选择操作完所有步骤,最后需要显示的时候才转为 RGB模式.

Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2RGB);

5、装载结果

然后是创建图片装其写入

//创建图片
Texture2D textureA = new Texture2D(dst.cols(), dst.rows(), TextureFormat.RGB24, false);
//将Mat的图片写入Texture2D中
Utils.matToTexture2D(dst, textureA);

完整代码:

下面是项目的完整代码:

Mat src1, src2, dst;
float alpha = 0.5f;
float beta = (1.0f - alpha);
string readPath1 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/timg.jpg";
string readPath2 = Application.dataPath + "/OpenCVForUnity/Examples/Resources/lena.jpg";
src1 = Imgcodecs.imread(Utils.getFilePath(readPath1), Imgcodecs.IMREAD_COLOR);
src2 = Imgcodecs.imread(Utils.getFilePath(readPath2), Imgcodecs.IMREAD_COLOR);
dst = new Mat(src2.size(), Imgcodecs.IMREAD_COLOR);
//混合图片
Core.addWeighted(src1, alpha, src2, beta, 0, dst);
//转写色彩模式
Imgproc.cvtColor(dst, dst, Imgproc.COLOR_BGR2RGB);
//创建图片
Texture2D textureA = new Texture2D(dst.cols(), dst.rows(), TextureFormat.RGB24, false);
//将Mat的图片写入Texture2D中
Utils.matToTexture2D(dst, textureA);
//显示出图片
objA.GetComponent<Renderer>().material.mainTexture = textureA;

结语

这篇教程内容比较简单,大家可以耐心阅读一下,相信会有收获的
看到这了麻烦帮忙点个赞,谢谢。

猜你喜欢

转载自blog.csdn.net/ww1351646544/article/details/131632960