基于像素的二维图像配准简要介绍

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

function [refimgout] = warpimgrigid2d(refimg, rigidmatrix, movimg, interptype)
% 将movimg图像根据刚性配准矩阵warp到refimg, 计算ref img上个像素点的值

if nargin < 3
    error('input params are too small');
end
if nargin == 3
    interptype = 'cubic';
end
    
size2dref = [refimg.dim(1), refimg.dim(2)];
% 插值的点 movimg变换到refimg
xi = zeros(size2dref);  %height方向
yi = zeros(size2dref);  %width方向
size2dmov = [movimg.dim(1), movimg.dim(2)];
% xmov = zeros(size2dmov);   % 原始的点 movimg
% ymov = zeros(size2dmov);

x = refimg.origin(1) :  refimg.pixelspacing(1) : ( refimg.origin(1) + (refimg.dim(1)-1) * refimg.pixelspacing(1) );
y = refimg.origin(2) :  refimg.pixelspacing(2) : ( refimg.origin(2) + (refimg.dim(2)-1) * refimg.pixelspacing(2) );

% xx = repmat(x', [1, size2dref(2)]);
% yy = repmat(y, [size2dref(1), 1]);
[yy, xx] = meshgrid(y, x);

for i = 1 : size2dref(1)
    for j = 1 : size2dref(2)
        xi(i, j) = rigidmatrix(1, :) * [xx(i, j), yy(i, j), 1]';
        yi(i, j) = rigidmatrix(2, :) * [xx(i, j), yy(i, j), 1]';
    end
end

xl = movimg.origin(1) :  movimg.pixelspacing(1) : movimg.origin(1) + (movimg.dim(1)-1) * movimg.pixelspacing(1);
yl = movimg.origin(2) :  movimg.pixelspacing(2) : movimg.origin(2) + (movimg.dim(2)-1) * movimg.pixelspacing(2);
% xmov = repmat(xl', [1,size2dmov(2)]);
% ymov = repmat(yl, [size2dmov(1), 1]);
[ymov, xmov] = meshgrid(yl, xl);

imgslice = interp2(ymov, xmov, movimg.img, yi, xi, interptype, 0);

refimgout.img = max(imgslice,0);
refimgout.dim = refimg.dim;
refimgout.origin = refimg.origin;
refimgout.pixelspacing = refimg.pixelspacing;
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二维图像配准是指将两幅图像(通常为一幅参考图像和一幅待配准图像)进行对齐以使其在一定程度上重合。深度学习可以很好地应用于图像配准问题,其中最常见的方法是使用卷积神经网络(CNN)。 以下是一个基于PyTorch实现的简单二维图像配准示例: 首先,我们需要导入必要的库和模块: ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np import cv2 import matplotlib.pyplot as plt ``` 接下来,我们需要定义一个CNN模型。在这个示例中,我们只使用了一个简单的卷积层和全连接层。 ```python class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.conv1 = nn.Conv2d(1, 16, kernel_size=3, padding=1) self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) self.fc1 = nn.Linear(16*14*14, 10) self.fc2 = nn.Linear(10, 2) def forward(self, x): x = self.pool1(torch.relu(self.conv1(x))) x = x.view(-1, 16*14*14) x = torch.relu(self.fc1(x)) x = self.fc2(x) return x ``` 接下来,我们需要定义损失函数和优化器。在这个示例中,我们使用均方误差(MSE)作为损失函数,使用随机梯度下降(SGD)作为优化器。 ```python criterion = nn.MSELoss() optimizer = optim.SGD(net.parameters(), lr=0.01) ``` 然后,我们需要定义训练函数。在每次迭代中,我们将使用SGD优化器来更新模型权重,并计算训练集上的损失值。 ```python def train(net, trainloader, criterion, optimizer, epochs): losses = [] for epoch in range(epochs): running_loss = 0.0 for i, data in enumerate(trainloader, 0): inputs, labels = data optimizer.zero_grad() outputs = net(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() losses.append(running_loss) print('Epoch %d loss: %.3f' % (epoch + 1, running_loss / len(trainloader))) return net, losses ``` 最后,我们需要加载数据集并开始训练模型。 ```python # Load data img1 = cv2.imread('img1.png', cv2.IMREAD_GRAYSCALE) img2 = cv2.imread('img2.png', cv2.IMREAD_GRAYSCALE) # Resize images img1 = cv2.resize(img1, (256, 256)) img2 = cv2.resize(img2, (256, 256)) # Convert images to PyTorch tensors img1_tensor = torch.from_numpy(img1).float().unsqueeze(0).unsqueeze(0) img2_tensor = torch.from_numpy(img2).float().unsqueeze(0).unsqueeze(0) # Define dataset and dataloader dataset = torch.utils.data.TensorDataset(img1_tensor, img2_tensor) trainloader = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=True, num_workers=2) # Initialize model net = Net() # Train model net, losses = train(net, trainloader, criterion, optimizer, epochs=10) # Plot losses plt.plot(losses) plt.xlabel('Epoch') plt.ylabel('Loss') plt.show() ``` 这段代码将加载两个图像,并将它们转换为PyTorch张量。然后,我们将它们作为训练集传递给我们的模型。最后,我们训练模型并绘制损失值。 请注意,这是一个非常简单的示例,您可能需要根据您的数据集和模型进行适当的修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值