前言
图片的融合在日常的图片的处理中算是比较常用的功能,这节课我们一起来学习一下他的工作机制和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;
结语
这篇教程内容比较简单,大家可以耐心阅读一下,相信会有收获的
看到这了麻烦帮忙点个赞,谢谢。