Python实现互信息计算,并基于互信息实现图像配准

该博客介绍基于互信息的图像配准。利用Python的cv2库加载图像,scipy的minimize函数找最佳旋转和平移参数。目标是最大化两幅图像的互信息,通过梯度下降等算法实现。程序会输出配准前后的互信息值,并展示原图像和配准后的图像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

效果展示

互信息配准
其中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()

实验原图

实验使用的两张图如下:
Image1Image2

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值