亲宝软件园·资讯

展开

基于均值坐标(Mean-Value Coordinates)的图像融合算法的具体实现

charlee44 人气:0
[TOC] # 1. 概述 泊松融合是图像融合处理效果最好的算法,其来自于2004年Siggraph的经典paper:《Poisson Image Editing》。以这篇文章为发端,很多大神提出了一系列的优化算法。2009年, Zeev Farbman 在的SIGGRAPH上面提出的基于Mean-Value Coordinates方法的泊松融合加速算法《Coordinates for Instant Image Cloning》(文献二)。在这篇文章中,泊松方程被转换成拉普拉斯方程,并且提出了用均值坐标Mean-Value Coordinates来近似求解这个方程,从而达到实时运算的效果。 初步了解了一下原生的泊松融合算法和均值坐标融合算法,其原理包含的内涵十分丰富,包含一些诸如列散度、拉普拉斯算子、梯度场、泊松方程等等数学知识,要完全弄明白确实需要一定的基础。这里就重点关注一下根据《Coordinates for Instant Image Cloning》(文献二)实现图像融合的过程,有机会的话再详细推导一下其原理。 # 2. 实现 ## 2.1. 准备 在OpenCV中,已经收录了泊松融合算法,也就是函数seamlessClone():
![seamlessClone][imglink1]
这个算法要求输入一个源图像,一个目标图像,源图像希望融合到目标图像的位置,以及一个mask图像。这个mask图像也就是一张二值化图像,用来标识图像的ROI(region of interest感兴趣区域)。均值坐标融合算法的输入参数也是一样的,不过mask图像很难以处理,OpenCV自带的GUI难以满足需求。所以我这里通过QT来做GUI,通过OpenCV将图像显示到QT窗体上,然后再QT窗体的图像区域内绘制多边形,多边形内部即为ROI。可以参考我的这两篇文章: [《使用QT显示OpenCV读取的图片》][netlink1] [《使用QT绘制一个多边形》][netlink2] ## 2.2. 核心 ### 2.2.1. 均值坐标(Mean-Value Coordinates) 在论文中提出了一个很重要的概念也就是均值坐标(Mean-Value Coordinates)。对于如下多边形内部的点:
![Mean-Value Coordinates][imglink2]
都有一系列与多边形边界相关的坐标值:
![Mean-Value Coordinates][imglink3]
也就是说,只要确定了ROI,也就确定了ROI区域内每个点的均值坐标(Mean-Value Coordinates),每个点会有m个值(m为ROI边界多边形的顶点)。 ### 2.2.2. ROI边界栅格化 论文中是以ROI边界多边形为例的,实际用到图像处理中是不会只用几个多边形的节点来计算的,而应该是ROI边界上连续的点。实际上不用想也知道,图像融合最关键的部分就是ROI边界部分的像素值。必须要用到ROI边界上所有的像素值来计算。 也就是说这里还需要一个工作,就是将ROI边界多边形栅格化,取得其上连续的像素位置,得到准确的栅格化多边形边界。这里可以参看我的这篇文章[《矢量线的一种栅格化算法》][netlink3]。按照顺序逐条将多边形的边栅格化,即可以得到ROI的栅格化多边形边界。 ### 2.2.3. 核心实现 论文给出的算法伪代码如下:
![MCV融合][imglink4]
这段算法描述并不复杂,转换成自然语言如下: 1. 假设ROI区域内有n个点,其边界由m个点组成。 2. 那么可以求每个点的MVC(均值坐标),每个点有m个坐标值,一共有n个点,MVC就是就是一个n*m的矩阵。 3. 求ROI区域边界的像素差diff,显然其是一个m*1的矩阵。 4. 那么新图像ROI区域的插值为:r = MVC * diff,矩阵乘法后r为n*1矩阵。 5. 将插值r与原图像g矩阵相加:f = g + r,替换目标图像相应位置的值。 核心部分具体的实现代码如下: ```cpp QTime startTime = QTime::currentTime(); //Step1:找到边界上所有的像素点 vector

加载全部内容

相关教程
猜你喜欢
用户评论