配准中的搜索空间&平移变换MATLAB实现

搜索空间

搜索空间包括空间变换范围和空间变换方式两部分。最常用的空间变换方式为仿射变换,它可以实现平移、旋转和按比例缩放。

在这里插入图片描述

平移变换

  1. 实现原理:将图像中所有的像素按照给定的平移量水平、垂直方向移动。

    设(x_0,y_0)为原图像上的点,图像水平平移量为t_x,垂直平移量为t_y,则平移后点(x_0,y_0)坐标变为(x_1,y_1)。示意图如下

    本图片来源参考资料

    即,
    { x 1 = x 0 + t x y 1 = y 0 + t y \left\{ \begin{array}{c} x_1=x_0+t_x\\ y_1=y_0+t_y\\ \end{array} \right. {x1=x0+txy1=y0+ty
    用矩阵表示为
    [ x 1 y 1 1 ] = [ x 0 y 0 1 ] [ 1 0 0 0 1 0 t x t y 1 ] \left[ \begin{matrix} x_1& y_1& 1\\ \end{matrix} \right] =\left[ \begin{matrix} x_0& y_0& 1\\ \end{matrix} \right] \left[ \begin{matrix} 1& 0& 0\\ 0& 1& 0\\ t_x& t_y& 1\\ \end{matrix} \right] [x1y11]=[x0y01]10tx01ty001
    对上面矩阵求逆可以得到反向变换
    [ x 0 y 0 1 ] = [ x 1 y 1 1 ] [ 1 0 0 0 1 0 − t x − t y 1 ] \left[ \begin{matrix} x_0& y_0& 1\\ \end{matrix} \right] =\left[ \begin{matrix} x_1& y_1& 1\\ \end{matrix} \right] \left[ \begin{matrix} 1& 0& 0\\ 0& 1& 0\\ -t_x& -t_y& 1\\ \end{matrix} \right] [x0y01]=[x1y11]10tx01ty001
    其对应坐标方程为
    { x 0 = x 1 − t x y 0 = y 1 − t y \left\{ \begin{array}{c} x_0=x_1-t_x\\ y_0=y_1-t_y\\ \end{array} \right. {x0=x1txy0=y1ty

  2. 对于新图像中的点,如果该点的灰度值在原始图像中没有可以,可以直接设置为0或255。相反,原图像的部分像素点可能没有包含在新图像中,也就是原图像中点被移出了显示区域。如果不希望丢失被移出的部分的图像,可以将新图像的宽|增大t_x|,高增大|t_y|。

  3. 代码实现

OldImage = imread('ex.png');
x= -20,y=70; % 上移20,右移70
imshow(mat2gray(OldImage));
[nrows,ncols] = size(OldImage);%获取原图像的尺寸
width = nrows;
height = ncols;
NewImage = uint8(zeros(width,height));

T = [1,0,0;0,1,0;x,y,1];
tform = maketform('affine',T);

tx = zeros(width,height);%正向坐标值
ty = zeros(width,height);
for i = 1:width
    for j = 1:height
        tx(i,j) = i; % tx 保存各位置的横坐标
        ty(i,j) = j; % ty 保存各位置的纵坐标
    end
end
[w,z] = tforminv(tform,tx,ty); % 反向坐标值

for i = 1:width
    for j =1:height
        source_x = w(i,j);
        source_y = z(i,j);
        if (source_x>=width-1 || source_y>=height-1 ||double(uint16(source_x))<=0 || double(uint16(source_y))<=0) %疑问[为啥不是width+1 height+1]
            NewImage(i,j) = 0; % 新图像的点不在原图像中,直接赋值0
        else
            if (source_x/double(uint16(source_x))==1.0)&&(source_y/double(uint16(source_y))==1.0)
                % 整数点中的值直接将原图像中的值赋值给新图像
                NewImage(i,j) = OldImage(int16(source_x),int16(source_y));
            else
                % 不在整数点位置,采用双线性插值给新图像赋值
                a = double(uint16(source_x));
                b = double(uint16(source_y));
                x11 = double(OldImage(a,b)); % x11 x12 x21 x22都是灰度值
                x12 = double(OldImage(a,b+1));
                x21 = double(OldImage(a+1,b));
                x22 = double(OldImage(a+1,b+1));
                NewImage(i,j)= uint8((b+1-source_y)*((source_x-a)*x21+(a+1-source_x)*x11)+...
                (source_y-b)*((source_x-a)*x22+...
                (a+1-source_x)*x12));
                % 这个双线性插值是先在行方向插值,再在列方向插值,所以上面形式。
            end
            
         end
    end
end
I = NewImage;
figure,imshow(mat2gray(I))
  • 以上为参考书实现方式
    关于上述代码中双线性插值部分代码的理解。

    参考草稿图,NewImage(i,j)对应原图像中的点S,S点坐标在代码中为(source_x,source_y),其周围的四个整数点分别为A(a,b),B(a,b+1),C(a+1,b),D(a+1,b+1)。先利用A、D点插值计算S1的灰度值,利用B、C点插值计算S2的灰度值,然后利用S1和S2计算出S的灰度值。

    下图为代码中对应的计算过程。

    在这里插入图片描述
    【这里我有个疑问是代码中(source_x,source_y)转化为uint16后,不一定是左上角那个点吧?】

  • 下面是自己写的简易实现【目前没发现啥问题】

img = imread('ex.png');

oldImg = double(img);
figure,imshow(oldImg);
tx = -5; % 从结果来看,tx是上下平移,tx大于0则向下
ty =70; % ty是左右平移,ty大于0则向右平移
[width,height] = size(img);
newImg = zeros(width,height);
for i= 1:width
    for j=1:height
        newX = round(i+tx);
        newY = round(j+ty);
        if (newX<=width)&&(newY<=height)&&(newX>0)&&(newY>0) %不能等于0,从1开始
            newImg(newX,newY)=oldImg(i,j);
        end
    end
end
figure,imshow(newImg)
  1. 实现效果:原图在这里插入图片描述

当平移x=-20,y=70时:在这里插入图片描述
y=70右移70,x=-20上移20。

参考资料

  • 《图像配准技术及其MATLAB编程实现》
  • 原始图片“囧”来源网络图片下载链接
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 傅里叶梅林变换配准是一种常用的图像配准方法,通过将图像从空间域转换到频域,在频域进行配准,可大大提高配准精度和速度。在matlab,可以使用fft2函数实现图像的傅里叶变换,使用ifft2函数实现傅里叶逆变换。使用fftshift函数可以将频域图像的低频分量移到心,从而方便进行频域配准。常用的配准方法包括基于相位相关性的配准、基于灰度互相关的配准和基于两个图像的互信息的配准。其,相位相关法利用了两幅图像的相位信息进行匹配,精度较高;灰度互相关法则使用图像的灰度信息进行匹配,对于灰度变化较大的图像具有较好的适应性;而互信息法则基于两幅图像的统计特性进行匹配,对于复杂的图像匹配具有很好的性能。在配准过程,需要对图像进行预处理,如滤波、对齐、修建等,同时还需要选择合适的图像评价函数、优化算法和配准流程,以达到较好的配准精度和鲁棒性。 ### 回答2: 傅里叶梅林变换配准(matlab)是一种图像处理技术,用于图像配准和匹配。它利用图像的频率域进行比较和匹配,使得图像在旋转、缩放、平移等变换后仍能进行精确匹配。 在matlab,可以使用fft2函数对图像进行频率域变换,并将其转换为幅度谱和相位谱。在进行配准时,可以对要匹配的图像进行相同的处理步骤,并将它与参考图像进行比较,根据幅度谱和相位谱的匹配度来确定要应用的变换。 具体实现步骤包括: 1. 使用imread函数读取要匹配的图像和参考图像; 2. 对两幅图像分别进行fft2函数的频率域变换; 3. 计算幅度谱和相位谱; 4. 根据幅度谱和相位谱的匹配度,确定要应用的变换; 5. 使用ifft2函数将变换后的图像转换回空间域。 6. 最后使用imshow函数将处理后的图像显示出来。 需要注意的是,在进行匹配时要选取合适的特征点,以提高匹配的准确性。同时,在进行变换时还需考虑图像边缘的处理,以免出现显著的畸变。 总之,傅里叶梅林变换配准(matlab)是一种非常实用的图像处理技术,适用于各种类型的图像配准和匹配,可以提高图像处理的准确性和效率。 ### 回答3: 傅里叶梅林变换配准matlab是一种针对图像的处理方法。其核心思想是将两幅图像分别进行傅里叶变换,然后将其频谱相乘,接着进行逆傅里叶变换,最终得到配准后的图像。 在matlab,可以使用函数fft2实现傅里叶变换和ifft2实现逆傅里叶变换,同时还需要用到函数fftshift来进行变换,使图像频率区域的原点位于图像心。 具体操作步骤为:先将两幅图像读入matlab,然后使用fft2函数对其进行傅里叶变换,再使用fftshift函数进行变换,接着将其频谱相乘,并且再次使用ifftshift函数进行变换,最后使用ifft2函数进行逆傅里叶变换,得到配准后的图像。 需要注意的是,在进行配准之前,需要对两幅图像先进行预处理,例如去除噪声、灰度化、直方图均衡化等,以提高配准的准确度。 总之,傅里叶梅林变换配准matlab是一种高效、准确的图像处理技术,广泛应用于医学影像、地球科学、遥感图像等领域。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值