这几天在做图片的拼接融合,参考了网上的一个教程,文章末尾附上链接,处理效果还是不错的,但是速度比较慢。
总结一下思路:
1.读取两张图片,做边界填充,这个根据自己图片的融合范围自己调整(要求两个图片大小一致)
2.通过sift特征点检测,然后进行特征点的匹配筛选
3.通过匹配的像素点计算单应性矩阵
4.对读取的后一张图片用单应性矩阵进行仿射变换
5.通过双线性插值融合图片重叠部分
在第五部分,原方法是通过逐像素点融合图片,速度很慢,在这里我把它改成了用numpy库来处理融合过程,在我的电脑上从之前的融合需要15.6s到使用numpy的4.8s, 可见numpy对矩阵的处理速度还是比较快的。
下面贴上代码
import numpy as np
import cv2
from matplotlib import pyplot as plt
import time
def stitch(path1, path2):
"""
传入图片路径,返回变换过后的填充图片
:param path1:
:param path2:
:return:
"""
# 边界填充
top, bot, left, right = 100, 100, 0, 800
img1 = cv2.imread(path1)
img2 = cv2.imread(path2)
img1_size = img1.shape[:2]
img2 = cv2.resize(img2, (img1_size[1], img1_size[0]))
srcImg = cv2.copyMakeBorder(img1, top, bot, left, right, cv2.BORDER_CONSTANT, value=(0, 0, 0))
testImg = cv2.copyMakeBorder(img2, top, bot, left, right, cv2.BORDER_CONSTANT, value=(0, 0, 0))
img1gray = cv2.cvtColor(srcImg, cv2.COLOR_BGR2GRAY)
img2gray = cv2.cvtColor(testImg, cv2.COLOR_BGR2GRAY)
sift = cv2.xfeatures2d_SIFT().create()
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1gray, None)
kp2, des2 = sift.detectAndCompute(img2gray, None)
# FLANN parameters
FLANN_INDEX_KDTREE = <