图像旋转配准matlab实现

源程序展示

主程序代码

% 读取原图像和旋转后的图像
rotatedImageAdjusted=adjustRotatedImage('t002.jpg', 't002r14.jpg');

originalImage = imread('t002.jpg');
%filteredImage = removeNoiseMeanFilter(rotatedImageAdjusted);
rotatedImage=rotatedImageAdjusted;


% 创建默认的 optimizer 和 metric
optimizer = registration.optimizer.RegularStepGradientDescent;
metric = registration.metric.MeanSquares;


% 尝试使用 'rigid' 方法进行图像配准
tform_rigid = imregtform(rotatedImage, originalImage, 'rigid', optimizer, metric);
registeredImage_rigid = imwarp(rotatedImage, tform_rigid, 'OutputView', imref2d(size(originalImage)));

% 显示结果图像
figure;
subplot(1, 3, 1), imshow(originalImage), title('原始图像');
subplot(1, 3, 2), imshow(rotatedImage), title('旋转后的图像');
subplot(1, 3, 3), imshow(registeredImage_rigid), title('rigid');

函数function rotatedImageAdjusted=adjustRotatedImage(originalImagePath, rotatedImagePath)代码

function rotatedImageAdjusted=adjustRotatedImage(originalImagePath, rotatedImagePath)
    % 读取原始图像和旋转后的图像
    originalImage = imread(originalImagePath);
    rotatedImage = imread(rotatedImagePath);

    % 将白色像素点设为 NaN,以便在计算均值时忽略这些像素
    originalImage(originalImage == 255) = NaN;
    rotatedImage(rotatedImage == 255) = NaN;
    
    figure;
    subplot(1, 2, 1), imshow(originalImage), title('1');
    subplot(1, 2, 2), imshow(rotatedImage), title('2');
    
    % 计算两图像除了白色像素点之外的像素点的均值
    meanOriginal = nanmean(originalImage(:));
    meanRotated = nanmean(rotatedImage(:));

    % 显示结果
    disp(['原始图像除白色像素外的均值:', num2str(meanOriginal)]);
    disp(['旋转图像除白色像素外的均值:', num2str(meanRotated)]);

    % 计算需要调整的灰度值
    adjustmentValue = meanOriginal - meanRotated;
    disp(['调整后旋转图像除白色像素外的均值:', num2str(adjustmentValue+meanRotated)]);
    % 对旋转图像的像素进行调整
    rotatedImageAdjusted = rotatedImage + adjustmentValue;

    % 显示调整前后的图像
    figure;
    subplot(1, 2, 1), imshow(rotatedImage), title('旋转图像(未调整)');
    subplot(1, 2, 2), imshow(rotatedImageAdjusted), title('旋转图像(已调整)');
end

源程序详解

主程序部分

读取原图像和旋转后的图像

rotatedImageAdjusted=adjustRotatedImage('t002.jpg', 't002r14.jpg');%对给出的旋转图像进行灰度调整并命名为rotatedImageAdjusted
originalImage = imread('t002.jpg');%读入原图并命名为originalImage
rotatedImage=rotatedImageAdjusted;%将rotatedImageAdjusted命名为rotatedImage

创建默认的 optimizer

% 创建默认的 optimizer 和 metric
optimizer = registration.optimizer.RegularStepGradientDescent;
metric = registration.metric.MeanSquares;

        上述代码中的 optimizer 部分涉及到 MATLAB 的图像配准工具箱(Image Processing Toolbox)中的配准优化器的设置。下面是对这段代码的详细解释:

% 设置配准优化器为 RegularStepGradientDescent
optimizer = registration.optimizer.RegularStepGradientDescent;

        registration.optimizer.RegularStepGradientDescent: 这是 MATLAB 图像配准工具箱中的一个优化器对象,用于配准过程中的参数优化。

1. optimizer: 这个变量是用来存储优化器对象的,它将在后续的 imregtform 函数中用作参数之一,以指定在配准过程中使用哪个优化算法。

2. registration:在 MATLAB 的图像处理工具箱(Image Processing Toolbox)中,registration是一个命名空间,包含了与图像配准相关的函数、类和工具。它提供了一系列用于将两幅图像进行对齐的工具,以便进行后续的分析或处理。

以下是registration命名空间的一些主要功能和作用:
        图像配准:  registration 提供了多种图像配准的方法,包括基本的刚性(平移、旋转、缩放)配准,以及更复杂的非刚性配准。这些方法可以将两幅图像在几何上对齐,使得它们在某种度量下达到最佳匹配。
        优化算法:registration 包含了不同的优化算法,用于在配准过程中寻找最优的变换参数。常见的算法包括梯度下降、最小二乘法等,可以根据具体需求选择合适的优化器。
        相似性度量:在配准中,需要定义一种度量来衡量两幅图像之间的相似程度。registration 提供了多种相似性度量方法,如均方差、互信息等,用于评估图像的相似性。
        变换模型:配准过程中通常需要指定变换模型,描述了一个图像如何通过平移、旋转、缩放等操作与另一幅图像对齐。registration 提供了不同类型的变换模型,如刚性、仿射、非刚性等。
        自动配准:除了手动指定参数外,registration还提供了自动配准的函数,例如 imregister,该函数能够自动检测特征并执行图像配准。
总体而言,registration 命名空间为 MATLAB 提供了一套丰富而灵活的工具,用于处理图像配准的各个方面。这对于图像处理、医学影像、计算机视觉等领域的应用非常重要。

3.RegularStepGradientDescent :RegularStepGradientDescent 是一种基于梯度下降的优化算法,它通过计算目标函数(通常是相似性度量)的梯度来寻找参数的最优值。这个优化器的特点是使用固定步长来更新参数。

4.其他参数设置: 代码中没有显示设置其他参数,因为 RegularStepGradientDescent 有默认的参数值,但你可以根据需要进一步调整这些参数。如果需要设置其他参数,可以使用 registration.optimizer.RegularStepGradientDescent 对象的属性进行设置。例如:
optimizer.MaximumIterations = 100; % 设置最大迭代次数
optimizer.MinimumStepLength = 1e-5; % 设置最小步长

        总体而言,上述代码的目的是设置一个梯度下降优化器对象,以便在图像配准过程中使用 Regular Step Gradient Descent 算法来优化参数

创建默认的metric

% 创建默认的 optimizer 和 metric
optimizer = registration.optimizer.RegularStepGradientDescent;
metric = registration.metric.MeanSquares;

        上述代码中的metric部分涉及到 MATLAB 的图像配准工具箱(Image Processing Toolbox)中的配准度量的设置。下面是对这段代码的详细解释:

% 创建默认的 optimizer 和 metric
metric = registration.metric.MeanSquares;

        在MATLAB中,registration.metric.MeanSquares 是用于图像配准(Image Registration)的一种度量标准,即均方差(Mean Squares)。以下解释 registration.metric.MeanSquares 的每个参数的意义:

1.metric:这是你创建的度量标准对象的名称,你可以使用这个变量引用均方差度量标准。

在图像配准中,度量用于评估两幅图像之间的相似性,以便优化配准的参数。在 MATLAB 的 Image Processing Toolbox 中,配准函数(如 imregtform)通常需要指定一个度量对象,以衡量图像之间的相似性。这个度量对象被称为 "metric"。这个度量对象根据所选的配准方法和优化算法来衡量两幅图像的相似性,然后优化算法根据这个度量来寻找最优的配准参数。

一些常见的度量包括:

  1. 均方误差(Mean Squared Error,MSE): 衡量两幅图像像素之间的平均差异。

  2. 互信息(Mutual Information): 衡量两幅图像之间的信息量关系,用于多模态图像配准。

2.registration.metric.MeanSquares:registration.metric.MeanSquares 只是一个对象的引用,而不是直接传递给某个函数的参数。在实际使用中,你通常会将这个度量标准对象作为参数传递给图像配准函数,以便进行配准的优化。

如果要将 MeanSquares 度量标准应用于具体的图像配准,可以在 imregconfigimregister 中使用

        总的来说,registration.metric.MeanSquares 是一个用于衡量两幅图像之间差异的度量标准,它计算图像像素值之间的均方差。在实际应用中,通常与图像配准的优化器一起使用,以寻找最优的变换参数,使均方差最小化。

尝试使用 'rigid' 方法进行图像配准

% 尝试使用 'rigid' 方法进行图像配准,获得变换矩阵
tform_rigid = imregtform(rotatedImage, originalImage, 'rigid', optimizer, metric);

        这段代码使用 MATLAB 的 imregtform 函数进行图像配准,其中配准的变换模型为刚性变换(rigid transformation)。以下是对该代码的详细解释:

        解释各个参数:

1.rotatedImage:旋转后的图像,即需要配准的移动图像。

2.originalImage:原始图像,即参考图像。

3.'rigid':表示采用刚性变换模型进行配准。刚性变换包括平移、旋转和缩放,它保持图像的形状和大小。

4.optimizer:配准优化器对象,负责寻找最佳的变换参数。可以使用 imregconfig 函数配置不同的优化器,例如 registration.optimizer.RegularStepGradientDescent。

5.metric:配准度量对象,用于衡量图像之间的相似性。可以使用不同的度量方法,例如 registration.metric.MeanSquares或registration.metric.MattesMutualInformation。

6.tform_rigid:函数返回值,表示找到的刚性变换对象。可以通过该对象获取变换参数,或者将其应用于图像进行配准。 整体来说,这段代码的作用是使用刚性变换模型对旋转后的图像进行配准,使其与原始图像对齐。配准的优化过程依赖于选择的优化器和度量方法。

% 尝试使用 'rigid' 方法进行图像配准,变换
registeredImage_rigid = imwarp(rotatedImage, tform_rigid, 'OutputView', imref2d(size(originalImage)));

        这段代码使用了 MATLAB 中的 imwarp 函数,通过刚性变换对旋转后的图像进行配准,使其与原始图像对齐。以下是对该代码的详细解释:

解释各个参数:

1.rotatedImage:旋转后的图像,即需要配准的移动图像。

2.tform_rigid:刚性变换对象,通过 imregtform 函数获取。该对象包含了配准的刚性变换参数。

3.originalImage:原始图像,即参考图像。

4.'OutputView':表示输出图像的空间参考。这里使用了原始图像的空间参考,即 imref2d(size(originalImage))。这样做的目的是保持配准后的图像与原始图像在同一坐标系统中。

6.registeredImage_rigid:函数返回值,表示经过刚性变换配准后的图像。

        整体来说,这段代码的作用是将旋转后的图像按照找到的刚性变换参数进行配准,输出对齐后的图像。通过指定输出图像的空间参考,可以确保配准后的图像与原始图像在相同的坐标系统中。

显示结果图像

% 显示结果图像
figure;
subplot(1, 3, 1), imshow(originalImage), title('原始图像');
subplot(1, 3, 2), imshow(rotatedImage), title('旋转后的图像');
subplot(1, 3, 3), imshow(registeredImage_rigid), title('rigid');

函数adjustRotatedImage部分

function rotatedImageAdjusted=adjustRotatedImage(originalImagePath, rotatedImagePath)
    % 读取原始图像和旋转后的图像
    originalImage = imread(originalImagePath);
    rotatedImage = imread(rotatedImagePath);

    % 将白色像素点设为 NaN,以便在计算均值时忽略这些像素
    originalImage(originalImage == 255) = NaN;
    rotatedImage(rotatedImage == 255) = NaN;
    
    figure;
    subplot(1, 2, 1), imshow(originalImage), title('1');
    subplot(1, 2, 2), imshow(rotatedImage), title('2');
    
    % 计算两图像除了白色像素点之外的像素点的均值
    meanOriginal = nanmean(originalImage(:));
    meanRotated = nanmean(rotatedImage(:));

    % 显示结果
    disp(['原始图像除白色像素外的均值:', num2str(meanOriginal)]);
    disp(['旋转图像除白色像素外的均值:', num2str(meanRotated)]);

    % 计算需要调整的灰度值
    adjustmentValue = meanOriginal - meanRotated;
    disp(['调整后旋转图像除白色像素外的均值:', num2str(adjustmentValue+meanRotated)]);
    % 对旋转图像的像素进行调整
    rotatedImageAdjusted = rotatedImage + adjustmentValue;

    % 显示调整前后的图像
    figure;
    subplot(1, 2, 1), imshow(rotatedImage), title('旋转图像(未调整)');
    subplot(1, 2, 2), imshow(rotatedImageAdjusted), title('旋转图像(已调整)');
end

        这段 MATLAB 代码是一个用于图像灰度调整的函数,主要目的是使旋转后的图像的灰度分布与原始图像尽可能一致。以下是对代码的解释:

1.图像加载与预处理

通过 imread 函数读取原始图像和旋转后的图像。

将原始图像和旋转后的图像中的白色像素点(灰度值为255)设为 NaN。这是为了在计算均值时忽略这些像素,以确保计算的均值不受白色像素的影响。

2.图像显示

通过 subplotimshow 函数创建一个图形窗口,展示原始图像和旋转后的图像,方便观察两者的差异。

3.计算均值

使用 nanmean 函数计算原始图像和旋转后的图像除白色像素点之外的像素的均值。

显示计算结果,分别展示原始图像和旋转后的图像的均值。

4.灰度调整

计算需要调整的灰度值,即使旋转后的图像的均值接近原始图像的均值。

对旋转后的图像的每个像素进行灰度调整,以使其均值与原始图像的均值接近。

5.显示调整前后的图像

通过 subplotimshow 函数创建另一个图形窗口,展示灰度调整前后的旋转图像。

左侧子图显示未经调整的旋转图像,右侧子图显示经过调整后的旋转图像。

        这个函数的主要作用是确保旋转后的图像在灰度上与原始图像相匹配,以便后续的图像配准过程更加准确。通过这种方式,可以提高配准的效果,使得两幅图像更好地对齐。

  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值