欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv 泊松融合

程序员文章站 2022-07-14 16:50:24
...

图像融合简介

图像融合(Image Fusion)是指将多源信道所采集到的关于同一目标的图像数据经过图像处理和计算机技术等,最大限度的提取各自信道中的有利信息,最后综合成高质量的图像,以提高图像信息的利用率、改善计算机解译精度和可靠性、提升原始图像的空间分辨率和光谱分辨率,利于监测。

在图像处理中,图像融合是一个基本的处理操作,目的是将源图像中一个物体或者一个区域嵌入到目标图像而生成一个新的图像。在对图像进行合成的过程中,为了使合成后的图像更自然,合成边界应当保持无缝。但如果源图像和目标图像有着明显不同的纹理特征,则直接合成后的图像会存在明显的边界。

在我的另一篇文章中介绍了图像金字塔图像融合,也是一种图像融合。opencv 图像金字塔及图像重建、融合

泊松融合

泊松融合,利用泊松方程求解像素最优值的方法,在保留了源图像梯度信息的同时,融合源图像与目标图像。该方法根据用户指定的边界条件求解一个泊松方程,实现了梯度域上的连续,从而达到边界处的无缝融合。

将泊松方程引入图像融合后,很容易在梯度域中进行应用,并且可以通过局部的图像编辑得到全局融合的效果。我们都知道,图像梯度的最重要性质是梯度可以用来反映图像中亮度改变最明显的区域,也就是说可以用梯度来捕捉图像上的亮度变化,梯度的方向在图像灰度的最大变化率上,它恰好可以反映出图像边缘的灰度变化。因此,要实现无缝融合,下面两点一定要满足:

      (1)边缘过渡要平滑,就是说梯度要小;

      (2)感兴趣区域内部的自身纹理要最大程度的保留;

泊松融合 vs 传统图像融合 

1、传统图像融合

  • 精确地选择融合区域:过程单调乏味且工作量大,常常无法得到好的结果。
  • Alpha-Matting:功能强大,但是实现复杂。

2、泊松(Poisson)融合

  • 选择融合区域的过程简单且方便。
  • 最终可以得到无缝融合的结果

变分法的解释泊松图像编辑

opencv 泊松融合

Delta I_A 表示融合图像块的梯度。变分方程的意义表明我们的无缝融合是以源图像块内梯度场为指导,将融合边界上目标场景和源图像的差异平滑地扩散到融合图像块 I 中,这样的话,融合后的图像块能够无缝地融合到目标场景中,并且其色调和光照可以与目标场景相一致。

代码实现

函数原型

void seamlessClone(InputArray src, InputArray dst, InputArray mask, Point p, OutputArray blend, int flags);

src:源文件;
dst:目标文件;
mask:源文件的mask文件;
p:src要在dst上摆放的位置;
blend:输出的融合图像;
flags:融合的方式,默认为NORMAL_CLONE;
融合方式有两种,分别是NORMAL_CLONE,MIXED_CLONE。

 泊松融合实例

#include <opencv2/opencv.hpp>
#include <time.h>

using namespace cv;
using namespace std;

int main() 
{
	//【1】参数准备
	clock_t startTime1, endTime1;
	clock_t startTime2, endTime2;
	//载入原图和目标图
	Mat srcImage = imread("srcImage.jpg", 1);
	Mat dstImage = imread("dstImage.jpg", 1);
	//安全性检测
	if (!srcImage.data) 
	{
		printf("srcImage载入有误\n");
		return false;
	}
	if (!dstImage.data)
	{
		printf("dstImage载入有误\n");
		return false;
	}	

	//原图的 mark
	Mat srcMark = 255 * Mat::ones(srcImage.rows, srcImage.cols, srcImage.depth());
	//融合放置的位置
	Point position(dstImage.cols / 2, dstImage.rows / 2);
		
	Mat nomalClone;
	Mat mixedClone;

	//NORMAL_CLONE 融合方式
	startTime1 = clock();
	seamlessClone(srcImage, dstImage, srcMark, position, nomalClone, NORMAL_CLONE);
	endTime1 = clock();

	//MIXED_CLONE 融合方式
	startTime2 = clock();
	seamlessClone(srcImage, dstImage, srcMark, position, mixedClone, MIXED_CLONE);
	endTime2 = clock();

	printf("NORMAL_CLONE 融合方式 所用时间:%d\n", endTime1 - startTime1);
	printf("MIXED_CLONE 融合方式 所用时间:%d\n", endTime2 - startTime2);

	//显示图像
	imshow("srcImage", srcImage);
	imshow("dstImage", dstImage);
	imshow("nomalClone", nomalClone);
	imshow("mixedClone", mixedClone);
	waitKey(0);

	system("pause");

	return true;
}

第一组实验:

srcImage

opencv 泊松融合

dstImage

opencv 泊松融合

nomalClone

opencv 泊松融合

mixedClone

opencv 泊松融合

运行时间:

opencv 泊松融合

在这一组实例中,两者运行时间差不多。因为原图背景与目标背景差不多,所以这两种融合方式看着差不多,其实仔细看,MIXED_CLONE方式融合的更好一些,过渡的自然。

第二组实验:

srcImage

opencv 泊松融合

dstImage

opencv 泊松融合

nomalClone

opencv 泊松融合

mixedClone

opencv 泊松融合

运行时间:

opencv 泊松融合

在这一组实例中,两者运行时间也差不多。因为原图背景与目标背景有明显差别,NOMAL_CLONE方式融合的就没有MIXED_CLONE方式融合的更好更自然。

参考:

https://zhuanlan.zhihu.com/p/64353235

https://blog.csdn.net/qq_41051855/article/details/80639501

https://www.cnblogs.com/CVFans/p/4475885.html