首页 > 代码库 > Python-OpenCV教程-8-图像金字塔融合
Python-OpenCV教程-8-图像金字塔融合
图像金字塔融合算法主要用在两幅图像的拼接中。两幅有重合区域的图片,如果直接个根据位置来拼接,那么由于两幅图片自身的差异,拼接完的图片上会有很明显的拼接线存在。
解决这个问题,最简单的方法是对两幅图片的重合区域的像素进行加权相加(这个操作可以理解为一种羽化的处理效果)。
设定一个权重w,就有公式:PB(i,j) = (1-w)*PA(i,j) + w*PB(i,j)可以计算重合区域融合后的像素值。
但是,这种简单的羽化对两幅图片的质量要求非常高,很对情况下并不能得到一个理想的效果。
因此,很多情况下,我们会选择稍微复杂的图像金字塔融合算法来处理这个重合区域。
先简单描述一下整个算法的流程,然后再具体介绍
1.用待处理的图像生成一系列的高斯金字塔图像。
2.根据高斯金字塔图像,计算出拉普拉斯金字塔图像。
3.根据高斯金字塔图像和拉普拉斯金子塔图像去重建重合区域的融合后的图像。
建立高斯金字塔的过程如下:
先对原图像进行高斯滤波,再去掉滤波之后的图像的的偶数行和偶数列(这样,这幅图像大小就是原图像的1/4了)。不断重复这个过程,直到达到要求的金子塔层数。(层数越高,那幅图就越小,这里定义第0层最高)
建立拉普拉斯金子塔的过程如下:
首先,我们要用高层的高斯金字塔图像去重建(expand)低层的图像。这里,我们假定用第0层的图像去重建第1层的图像,由于0层图像的大小是1层图像的1/4,所以我们必须对0层图像进行插值,使它达到1层图像的大小。这里,一般用0去作为偶数行和偶数列加入到原图像中,然后再进行高斯滤波。(注意,这里得到的重建后的第一层的图像跟原来的第一层的图像肯定不一样,因为高斯滤波丢失的信息是不可逆的)。
得到了重建后的1层图像,然后我们用原来的1层图像减去这个重建的图像,就得到了这一层的拉普拉斯金字塔图像。然后还是不断重复这个过程,就可以的得到整个的拉普拉斯图像金字塔了。
得到融合图像的过程如下:
用第n层的高斯金字塔图像加上第n层的拉普拉斯金字塔图像,然后用高斯插值的方法对这幅相加完的图像重建它第n-1层的图像。然后再用这个重建完的第n-1层的图像加上第n-1层图像的拉普拉斯金字塔图像,去重建第n-2层的图像...不断重复这个过程直到图像的大小合适。
在python中,向下建立低层金子塔图像的函数是cv2.pyrDown(),重建高层金字塔图像的函数是cv2.pyrUp()。
Python-OpenCV教程-8-图像金字塔融合