Image 确定图像的二维仿射变换

Image 确定图像的二维仿射变换,image,matlab,image-processing,matrix,affinetransform,Image,Matlab,Image Processing,Matrix,Affinetransform,我在确定下图的仿射变换矩阵时遇到问题 原始图像: 仿射变换图像: 我在图像上确定了2个点来求解仿射变换矩阵,但我得到的结果并没有将原始图像转换为所需的图像 代码如下,它首先求解矩阵并使用它将原始版本转换为转换版本: % Pixel values p1_aff = [164; 470]; p1_nor = [1; 512]; p2_aff = [470; 164]; p2_nor = [512; 1]; %p3_aff = [131;68]; %p3_nor = [166;61]; %p4_

我在确定下图的仿射变换矩阵时遇到问题

原始图像:

仿射变换图像:

我在图像上确定了2个点来求解仿射变换矩阵,但我得到的结果并没有将原始图像转换为所需的图像

代码如下,它首先求解矩阵并使用它将原始版本转换为转换版本:

% Pixel values
p1_aff = [164; 470]; 
p1_nor = [1; 512];
p2_aff = [470; 164];
p2_nor = [512; 1];
%p3_aff = [131;68];
%p3_nor = [166;61];
%p4_aff = [328;90];
%p4_nor = [456;59];

%Transformation matrix
syms a11 a12 a21 a22;
A = [a11 a12; a21 a22];

%Solving matrix
[Sx, Sy, Sz, Sk] = solve(A*p1_nor==p1_aff, A*p2_nor==p2_aff);
a11_d = double(Sx);
a12_d = double(Sy);
a21_d = double(Sz);
a22_d = double(Sk);

lena = imread('lena512.png');
new_aff = uint8(zeros(size(lena)));

for i = 1:size(lena,1)
    for j = 1:size(lena,2)
        % Applying affine transformation
        new_coord = [a11_d a12_d 0; a21_d a22_d 0; 0 0 1]*[i; j; 1];

        % Nearest-Neighbor interpolation for placing new pixels
        if(round(new_coord(1)) > 0 && round(new_coord(2)) > 0)
            new_aff(round(new_coord(1)),round(new_coord(2))) = lena(i,j);
        end
    end
end

imwrite(new_aff, 'lenaAffine_new.png');
在上述代码的末尾,我得到了以下图像:


有人知道这里出了什么问题吗?我快疯了。

两个对应点不足以确定仿射变换。你至少需要6个匹配项(如果我没弄错的话)

使用
cpselect
gui选择相应的点:

>> [input_points, base_points] = cpselect(oim2, oim1, 'Wait', true);
然后可以使用以下方法进行变换:

>> T = cp2tform( input_points, base_points, 'affine' );
>> aim2 = tformarray( oim2, T, makeresampler('cubic','fill'), [2 1], [2 1], size(oim1(:,:,1)'), [], 0 );

两个对应点不足以确定仿射变换。你至少需要6个匹配项(如果我没弄错的话)

使用
cpselect
gui选择相应的点:

>> [input_points, base_points] = cpselect(oim2, oim1, 'Wait', true);
然后可以使用以下方法进行变换:

>> T = cp2tform( input_points, base_points, 'affine' );
>> aim2 = tformarray( oim2, T, makeresampler('cubic','fill'), [2 1], [2 1], size(oim1(:,:,1)'), [], 0 );

是的,非常感谢。那一个奏效了。但是你能给我解释一下你做什么吗?因为我不应该使用这些工具,所以我需要手动完成这项工作。我在代码中尝试的是找到点并形成方程。在求解并找到仿射矩阵后,我将变换应用到图像中的每个像素。您应该手动执行哪一部分?找到对应的点?估计转变?变换图像?是的,非常感谢。那一个奏效了。但是你能给我解释一下你做什么吗?因为我不应该使用这些工具,所以我需要手动完成这项工作。我在代码中尝试的是找到点并形成方程。在求解并找到仿射矩阵后,我将变换应用到图像中的每个像素。您应该手动执行哪一部分?找到对应的点?估计转变?变换图像?