图像拼接(反向拼接巨难,求指教!)

现在有这样的两张图片,我们怎样可以进行图片拼接,然后得到一张新图片

下面我先讲下大致操作

关键点A与找到的两个关键点 X、Y的欧氏距离分别 d1、d2,且d1<d2。 欧氏距离(关键点A,关键点X)=d1。 欧氏距离(关键点A,关键点Y)=d2。 (1)d1<d2,比值较大:可能不是匹配点,通常是由噪声引起的。 (2)d1<d2,比值较小:是匹配点。

还是根据上面一篇的sift特征检测来实现的,具体看代码

代码部分

复制代码
import cv2
import numpy as np
import sys

def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)

def detectAndDecribe(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    sift=cv2.SIFT_create()
    kps, des = sift.detectAndCompute(gray, None)
    kps_float=np.float32([kp.pt for kp in kps])

    return (kps, kps_float, des)

imageA=cv2.imread('img1.jpg')
imageB=cv2.imread('img2.jpg')
cv_show('imageA',imageA)
cv_show('imageB',imageB)

(kpsA, kps_floatA, desA) = detectAndDecribe(imageA)
(kpsB, kps_floatB, desB) = detectAndDecribe(imageB)

matcher = cv2.BFMatcher()
rawMatches = matcher.knnMatch(desB, desA, k=2)
good=[]
matches=[]
for m in rawMatches:
    if len(m)==2 and m[0].distance < 0.65*m[1].distance:
        good.append(m)
        matches.append((m[0].queryIdx,m[0].trainIdx))
print(len(good))
print(matches)

vis=cv2.drawMatchesKnn(imageB, kpsB, imageA, kpsA, good, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv_show('vis',vis)

if len(matches)>4:
    ptsB=np.float32([kps_floatB[i] for (i,_) in matches])
    ptsA=np.float32([kps_floatA[i] for (_,i) in matches])

    (H,mask)=cv2.findHomography(ptsB,ptsA,cv2.RANSAC,10)

else:
    print('no matches')
    sys.exit()

result= cv2.warpPerspective(imageB, H,(imageB.shape[1]+imageA.shape[1],imageB.shape[0]))
cv_show('result1',result)

result[0:imageB.shape[0],0:imageB.shape[1]]=imageA
cv_show('result2',result)
cv2.imwrite('result.jpg',result)

代码详解3. 代码分步解析

1 图像显示辅助函数

复制代码
def cv_show(name,img):
    cv2.imshow(name, img)
    cv2.waitKey(0)
  • 功能:封装了OpenCV的图像显示逻辑
  • 参数:窗口名称和图像矩阵
  • 说明waitKey(0)表示等待用户按键后关闭窗口

2 特征检测与描述函数

复制代码
def detectAndDecribe(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    sift = cv2.SIFT_create()
    kps, des = sift.detectAndCompute(gray, None)
    kps_float = np.float32([kp.pt for kp in kps])
    
    return (kps, kps_float, des)
  • 灰度转换:将图像转为灰度图,减少计算量
  • SIFT特征检测:创建SIFT检测器,检测关键点并计算描述符
  • 关键点坐标提取:将关键点位置转换为NumPy数组格式便于后续处理
  • 返回值:关键点对象、关键点坐标和特征描述符

3 图像加载与特征提取

复制代码
imageA = cv2.imread('img1.jpg')
imageB = cv2.imread('img2.jpg')
(kpsA, kps_floatA, desA) = detectAndDecribe(imageA)
(kpsB, kps_floatB, desB) = detectAndDecribe(imageB)
  • 加载两张输入图像
  • 分别提取它们的SIFT特征

4 特征匹配与筛选

复制代码
matcher = cv2.BFMatcher()
rawMatches = matcher.knnMatch(desB, desA, k=2)
good = []
matches = []
for m in rawMatches:
    if len(m)==2 and m[0].distance < 0.65*m[1].distance:
        good.append(m)
        matches.append((m[0].queryIdx, m[0].trainIdx))
  • BFMatcher:使用暴力匹配器进行特征匹配
  • knnMatch:获取每个描述符的k个最佳匹配(此处k=2)
  • Lowe's Ratio Test:使用比例测试筛选优质匹配,保留距离比值小于0.65的匹配
  • 匹配结果good保存DMatch对象,matches保存匹配索引对

5 匹配可视化

复制代码
vis = cv2.drawMatchesKnn(imageB, kpsB, imageA, kpsA, good, None, 
                        flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv_show('vis', vis)
  • 可视化匹配结果,显示两图像间的特征对应关系
  • DRAW_RICH_KEYPOINTS标志会绘制带有关键点大小和方向的可视化结果

6 单应性矩阵计算

复制代码
if len(matches) > 4:
    ptsB = np.float32([kps_floatB[i] for (i,_) in matches])
    ptsA = np.float32([kps_floatA[i] for (_,i) in matches])
    
    (H, mask) = cv2.findHomography(ptsB, ptsA, cv2.RANSAC, 10)
else:
    print('no matches')
    sys.exit()
  • 条件检查:至少需要4对匹配点才能计算单应性矩阵
  • 点集提取:从匹配结果中提取对应的点坐标
  • findHomography:使用RANSAC算法计算单应性矩阵,鲁棒地估计图像间的变换关系
  • RANSAC参数10表示RANSAC重投影阈值

7 图像变换与拼接

复制代码
result = cv2.warpPerspective(imageB, H, (imageB.shape[1] + imageA.shape[1], imageB.shape[0]))
cv_show('result1', result)

result[0:imageB.shape[0], 0:imageB.shape[1]] = imageA
cv_show('result2', result)
cv2.imwrite('result.jpg', result)
  • warpPerspective:对图像B应用透视变换,将其对齐到图像A的坐标系
  • 图像融合:将图像A直接复制到变换后的图像B的左侧区域
  • 结果保存:将拼接结果保存为JPEG文件
相关推荐
chaojihaomai27 分钟前
AI电商商品图生成中的材质保真问题——扩散模型重建优先级分析与锁定式方案
人工智能·材质
大模型探索者2 小时前
2026 企业智能体平台选型指南:从通用到行业深耕,怎么选?
大数据·人工智能
深圳行云创新3 小时前
北极星知识图谱平台|太空越来越“拥挤”,知识图谱如何预测空间碎片碰撞风险?
人工智能·知识图谱
Am-Chestnuts3 小时前
国产AI多轮对话归档与多格式导出实践
人工智能·word
workflower4 小时前
装备企业的 AI 路线图
人工智能·深度学习·机器学习·设计模式·机器人
AKAMAI4 小时前
Linode接口及默认防火墙现已全面开放使用
人工智能·云计算
前端开发江鸟5 小时前
RAG 回答错了,问题到底出在召回、重排,还是生成?
人工智能
美狐美颜SDK开放平台5 小时前
直播app开发如何实现主播级美颜效果?美颜sdk开发方案详解
人工智能·音视频·美颜sdk·视频美颜sdk·美颜api
东方小月5 小时前
从零开发一个 Coding Agent(四):使用状态机校验大模型事件流
前端·人工智能·后端
大龄码农有梦想5 小时前
使用大模型服务如何保证数据安全?企业 AI 安全、私有化部署与治理实践
人工智能·私有化部署·数据安全·信创·ai agent·智能体·智能体开发平台