admin 发表于 2022-9-23 09:28:57

Python:图像处理-图像拼接

import cv2
import numpy

#读入图像
img1=cv2.imread('C:\\Users\\liuzhaoqing\\Desktop\\1.png')
img2=cv2.imread('C:\\Users\\liuzhaoqing\\Desktop\\2.png')

#将图像转换为灰度图
gray1=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
gray2=cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

# 建立SIFT生成器,以检测SIFT特征点
sift = cv2.xfeatures2d.SIFT_create()
#检测特征点,得到特征点集及对应的特征描述
kp1, des1= sift.detectAndCompute(gray1, None)
kp2, des2= sift.detectAndCompute(gray2, None)

#在图像上画出特征点
img01= numpy.copy(img1)
cv2.drawKeypoints(img1,kp1,img01)
cv2.imshow("img1_feature",img01)
img02= numpy.copy(img2)
cv2.drawKeypoints(img2,kp2,img02)
cv2.imshow("img2_feature",img02)

#建立暴力图像匹配器
matcher=cv2.DescriptorMatcher_create('BruteForce')

#使用KNN检测来自图1,图2的SIFT特征匹配对,K=2
K=2
matches=matcher.knnMatch(des1,des2,K)

#在图像上输出特征匹配(但这不是好的特征匹配)
result=cv2.drawMatchesKnn(gray2,kp2,gray1,kp1,matches,gray1,flags=2)
cv2.imshow("matches",result)

#对特征匹配结果进行筛选
goodmatches = []
good=[]
ratio=0.5
for m in matches:
    # 当最近距离跟次近距离的比值小于ratio值时,保留此匹配对
    if len(m) == 2 and m.distance < ratio * m.distance:
      goodmatches.append((m.trainIdx,m.queryIdx))
      good.append(m)

#在图像上输出特征匹配(这是好的特征匹配)
result=cv2.drawMatchesKnn(gray2,kp2,gray1,kp1,good,gray1,flags=2)
cv2.imshow("goodmatches",result)

#计算视觉变化矩阵
reprojThresh=3
#计算视角变化矩阵
#转换特征描述
kps1 = numpy.float32()
kps2 = numpy.float32()
if len(matches) > 4:
    #获得匹配对的点坐标
    p1=numpy.float32( for(_,i) in goodmatches])
    p2=numpy.float32( for(i,_) in goodmatches])
(H, status) = cv2.findHomography(p1,p2,cv2.RANSAC,reprojThresh)

#图像拼接
#将图1进行视角变换,result是变化后图片
result = cv2.warpPerspective(img1, H, (img1.shape + img2.shape, img1.shape))
#将图2与result拼接   
result, 0:img2.shape] = img2

#输出拼接图像
cv2.imshow('result',result)

cv2.waitKey()
页: [1]
查看完整版本: Python:图像处理-图像拼接