效果展示
其中Image1为基准图像,Image2为待配准图像,Registered Image2为Image2基于Image1配准后的效果。
此外,程序还会输出配准前的互信息,配准后的互信息值。
基本思想
互信息(Mutual Information)是信息论中的一个重要概念,用于衡量两个随机变量之间的相关性。如果两个随机变量完全独立,那么它们的互信息为0。如果两个随机变量完全相关,那么它们的互信息等于它们各自的熵。
在优化过程中,目标是最大化互信息,即找到使两幅图像的互信息最大的对齐参数。这通常通过梯度下降或其他优化算法来实现。本次实验采用python的cv2库来加载图像,并采用scipy的minimize函数来找到最佳的旋转和平移参数。使用python的cv2库首先加载两个图像,并计算它们的互信息。然后,基于互信息的图像配准方法找到最佳的旋转和平移参数,并应用这些参数到第二个图像。最后,计算并打印配准后的互信息,并显示原图像和配准后的图像。
代码
# 首先,导入实验所需的库函数cv2,numpy,scipy以及matplotlib.pyplot。
import cv2
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
# 然后实现计算互信息的函数为mutual_information,实现配准过程中所使用的损失函数为mutual_information_cost。
def mutual_information(hgram):
pxy = hgram / float(np.sum(hgram))
px = np.sum(pxy, axis=1)
py = np.sum(pxy, axis=0)
px_py = px[:, None] * py[None, :]
nzs = pxy > 0
return np.sum(pxy[nzs] * np.log(pxy[nzs] / px_py[nzs]))
# 实现损失函数,目的是找到配准参数使得互信息最大
def mutual_information_cost(params, image1, image2):
rotation, translation_x, translation_y = params
M = cv2.getRotationMatrix2D((image2.shape[1]/2, image2.shape[0]/2), rotation, 1)
M[0, 2] += translation_x
M[1, 2] += translation_y
registered_image2 = cv2.warpAffine(image2, M, (image2.shape[1], image2.shape[0]))
hist_2d, _, _ = np.histogram2d(image1.ravel(), registered_image2.ravel(), bins=20)
return -mutual_information(hist_2d)
# 加载图像
image1 = cv2.imread('figures/image1.jpg', cv2.IMREAD_GRAYSCALE).astype(float)
image2 = cv2.imread('figures/image2.jpg', cv2.IMREAD_GRAYSCALE).astype(float)
# image2 = cv2.resize(image2, (image1.shape[1],image1.shape[0]))
# 创建直方图
hist_2d, x_edges, y_edges = np.histogram2d(
image1.ravel(),
image2.ravel(),
bins=20
)
# 配准前,计算互信息
mi = mutual_information(hist_2d)
print(f"Mutual Information before registration: {mi}")
# 初始化参数,假设旋转和平移的参数都是0
params_initial = (0, 0, 0)
# 开始优化
result = minimize(mutual_information_cost, params_initial, args=(image1, image2), method='Powell')
# 调整第二张图片以实现图像配准
rotation, translation_x, translation_y = result.x
M = cv2.getRotationMatrix2D((image2.shape[1]/2, image2.shape[0]/2), rotation, 1)
M[0, 2] += translation_x
M[1, 2] += translation_y
registered_image2 = cv2.warpAffine(image2, M, (image2.shape[1], image2.shape[0]))
# 计算配准后的互信息
hist_2d, x_edges, y_edges = np.histogram2d(
image1.ravel(),
registered_image2.ravel(),
bins=20
)
mi = mutual_information(hist_2d)
print(f"Mutual Information after registration: {mi}")
# 展示图片
fig, axes = plt.subplots(1, 3, figsize=(20, 10))
axes[0].imshow(image1, cmap='gray')
axes[0].set_title('Image 1')
axes[1].imshow(image2, cmap='gray')
axes[1].set_title('Image 2')
axes[2].imshow(registered_image2, cmap='gray')
axes[2].set_title('Registered Image 2')
plt.show()
实验原图
实验使用的两张图如下: