线条特征图像拼接算法研究

3星 · 超过75%的资源 需积分: 9 1 下载量 78 浏览量 更新于2024-09-15 收藏 187KB PDF 举报
"基于线条特征的图像拼接算法是一篇探讨如何通过图像的线条特征进行图像拼接的技术论文,适用于创建全景图像。该算法利用图像重叠部分的线条特征进行数据分布配准,确保最终拼接出的图像无缝平滑。论文主要关注图像配准方法,分为基于区域的配准和基于特征的配准,其中基于特征的配准如特征点、特征线段的匹配方法更为有效,因为它对光照变化的容忍度更高,并且配准速度较快。该研究适用于使用普通照相机拍摄的重叠图像,通过算法处理合成全景图像,以提供更全面的视角来理解和认知现实世界。" 本文深入讨论了图像拼接技术,特别是针对全景图像的创建。作者提出了一种利用图像线条特征进行图像配准的算法,这种方法旨在克服基于像素值匹配的局限性,如计算量大和易受光照条件影响的问题。在图像拼接过程中,首先需要对图像进行配准,确保重叠部分能够准确对齐。现有的配准方法主要包括基于区域的配准和基于特征的配准。 基于区域的配准方法是通过比较一幅图像中像素值的领域与另一幅图像中相似领域的对应点。然而,这种方法计算复杂,且容易受到光照变化的影响。相比之下,基于特征的配准,如文献中提到的特征点和线段匹配,能够提供更稳定的结果,尤其是在光照条件变化不大的情况下。这种匹配方式主要依赖于特征属性的比较,因此配准速度更快。 在实际应用中,全景图像的制作通常需要使用普通照相机拍摄多张边界有重叠的照片,然后通过算法将这些照片拼接成一张无缝的全景图。为了减少因照相机转动引起的镜头偏斜和俯仰,拍摄时需要将照相机固定在支架上,以保持视点一致,仅改变观察方向。通过算法对这些重叠图像进行处理,可以生成一个更大的视角,从而帮助人们更全面地理解周围环境。 论文中提到的“一种基于线条特征的图像拼接算法”可能涉及到检测和提取图像中的线条特征,然后利用这些线条的分布信息进行图像间的配准。这一步骤对于确保拼接后的图像平滑无明显接缝至关重要。通过这种方式,可以创建出高质量的全景图像,增强视觉体验,特别是在旅游、建筑、地理信息系统等领域有着广泛的应用价值。
2019-12-04 上传
import cv2 as cv import numpy as np def cv_show(name,img): cv.imshow(name,img) cv.waitKey(0) cv.destroyAllWindows() def detectAndDescribe(image): gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY) sift = cv.xfeatures2d.SIFT_create() (kps,features)=sift.detectAndCompute(image,None)#这里的kps是一个特征点对象,,属性有.pt关键点坐标 #.angle关键点方向 .response响应强度 .size该点的直径大小 kps = np.float32([kp.pt for kp in kps])#此刻得到kps特征点对象中每一个特征点的坐标。 return (kps,features) def matchKeypoints(kpsA,kpsB,features1,features2,ratio): bf = cv.BFMatcher() rawMatches = bf.knnMatch(features1,features2,2)#rawMatcher是一个Dmatch型对象,属性有.distance描述符间距离 #.trainIdx样本图像特征点标识符,.queryIdx测试图像的特征点标识符,.imgIdx训练图像的索引 matches = [] for m,n in rawMatches: if m.distance 4: pts1 = np.float32([kpsA[i] for (_,i) in matches])#将测试图像的坐标储存到Pts1里 pts2 = np.float32([kpsB[i] for (i,_) in matches])#将样本图像的坐标储存到pts2里 # 计算视角变换矩阵H #参数一,测试图像的特征点坐标,参数二,样本图像的特征点坐标,参数三,RANSAC算法: #RANSCA原理, 因为拟合一条直线只需要两个点,因此我们每次随机选取两个点,做出直线,划定一个距离,判断落在直线周围距离范围点的个数, # 不断的迭代,直到找出拟合的直线,使得点落在上面最多的拟合曲线 #参数四:参数范围1~10,原图像的点经过变换后点与目标图像上对应点的误差,超过了就是outlier (H, status) = cv.findHomography(pts1, pts2, cv.RANSAC, 5) return (matches, H, status) return None imageA = cv.imread("E:/opencv/picture/right1.jpg") imageB = cv.imread("E:/opencv/picture/left1.png") (kpsA,features1)=detectAndDescribe(imageA) (kpsB,features2)=detectAndDescribe(imageB) M = matchKeypoints(kpsA, kpsB, features1, features2, 0.75) (matches, H, status) = M # 将图片A进行视角变换,result是变换后图片 result = cv.warpPerspective(imageA, H, (imageA.shape[1] + imageB.shape[1], imageB.shape[0])) cv_show('result1',result) result[0:imageB.shape[0], 0:imageB.shape[1]] = imageB cv_show('result2', result) 经常遇到的一个错误: new style getargs format but argument is not a tuple 针对这句代码:result = cv.warpPerspective(imageA,M,[imageA.shape[1]+imageB.shape[1],max(imageA.shape[0],imageB.shape[0])]) 原因是size那个参数应该是tuple(),而不是list[]。即应该是()而不是[]。 下面讲一下这个案例的大体过程: 1.首先我们是通过SIFT算法找到两张图(right,left)的特征点及特征向量,并把特征点的坐标储存起来。 2.通过蛮力匹配算法的得到kWmatches对象,将kWmatches对象的queryIdx和trainIdx给存起来,其中features1对应的图像为样本图像 3.求出样本图像的特征点坐标和测试图像的特征点坐标,找出这两坐标矩阵的H变换公式(利用RANSAC算法),将H变换公式对right图像做透视变换,得到拼接后的右边图像 4.将left原图赋给result对应的ROI区域,大功告成。