图像配准代码

import cv2
import numpy as np
import matplotlib.pyplot as plt
from skimage.feature import ORB, match_descriptors, plot_matches
from skimage.transform import AffineTransform, warp, resize
from skimage.measure import ransac
 
# 加载图像
# 以灰度模式读取两张图像,图像路径需根据实际情况进行调整
image1 = cv2.imread('/content/im1-copy.webp', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('/content/im2-copy.webp', cv2.IMREAD_GRAYSCALE)
 
# 检查图像是否成功加载
# 如果有一张或两张图像都加载失败,则抛出异常,并提示检查文件路径
if image1 is None or image2 is None:
    raise ValueError("一张或两张图像加载失败。请检查文件路径。")
 
# 将图像调整为相同大小
# 使用抗锯齿功能将图像大小调整为(500, 500),方便后续处理
image1 = resize(image1, (500, 500), anti_aliasing=True)
image2 = resize(image2, (500, 500), anti_aliasing=True)
 
# 初始化ORB特征检测器
# 设置要检测的关键点数量为500个
orb = ORB(n_keypoints=500)
 
# 检测图像1的特征点和描述子
# 调用ORB对象的方法来检测并提取图像1中的特征点和对应的描述子
orb.detect_and_extract(image1)
keypoints1 = orb.keypoints
descriptors1 = orb.descriptors
 
# 检测图像2的特征点和描述子
# 同样地,对图像2进行特征点和描述子的检测与提取操作
orb.detect_and_extract(image2)
keypoints2 = orb.keypoints
descriptors2 = orb.descriptors
 
# 匹配描述子
# 使用交叉验证的方式匹配图像1和图像2的描述子,得到匹配结果
matches = match_descriptors(descriptors1, descriptors2, cross_check=True)
 
# 提取匹配的特征点
# 根据匹配结果,从图像1的特征点中提取出对应的源特征点
src = keypoints1[matches[:, 0]]
# 从图像2的特征点中提取出对应的目标特征点
dst = keypoints2[matches[:, 1]]
 
# 绘制特征点和匹配情况
# 创建一个图像展示的子图布局
fig, ax = plt.subplots(1, 1, figsize=(12, 6))
# 设置图像以灰度模式显示
plt.gray()
 
# 调用函数绘制特征点匹配情况到指定的坐标轴上
plot_matches(ax, image1, image2, keypoints1, keypoints2, matches)
# 关闭坐标轴显示
ax.axis('off')
# 设置图像标题为“特征点匹配情况”
ax.set_title("特征点匹配情况")
# 展示绘制好的图像
plt.show()
 
# 验证匹配的数量
# 打印出匹配的特征点对数
print(f"匹配的特征点对数: {len(matches)}")
 
# 检查是否有足够的匹配数量来计算可靠的变换
# 如果匹配数量小于4,则抛出异常,提示无法计算可靠的变换
if len(matches) < 4:
    raise ValueError("匹配数量不足,无法计算可靠的变换")
 
# 使用RANSAC(随机抽样一致性)算法计算仿射变换以增强鲁棒性
# 将目标特征点和源特征点传入,指定最小采样数为4,残差阈值为2,最大尝试次数为1000
# 计算得到可靠的仿射变换模型以及内点(符合模型的点)信息
model_robust, inliers = ransac((dst, src),
                               AffineTransform, min_samples=4,
                               residual_threshold=2, max_trials=1000)
 
# 对图像进行变换(扭曲)
# 根据计算得到的仿射变换模型的逆变换,对图像1进行扭曲操作,使其与图像2对齐
# 输出形状设置为图像2的形状
registered_image = warp(image1, model_robust.inverse, output_shape=image2.shape)
 
# 显示结果
# 创建一个新的图像展示布局
plt.figure(figsize=(12, 6))
# 第一个子图,展示图像1
plt.subplot(1, 3, 1)
plt.title('图像1')
plt.imshow(image1, cmap='gray')
 
# 第二个子图,展示图像2
plt.subplot(1, 3, 2)
plt.title('图像2')
plt.imshow(image2, cmap='gray')
 
# 第三个子图,展示经过变换对齐后的图像
plt.subplot(1, 3, 3)
plt.title('变换对齐后的图像')
plt.imshow(registered_image, cmap='gray')
 
# 展示所有子图
plt.show()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值