Определение 2D аффинного преобразования изображений

У меня возникла проблема с определением матрицы аффинного преобразования изображения ниже.

Исходное изображение:

введите описание изображения здесь

Аффинно преобразованное изображение:

введите описание изображения здесь

Я определил 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');

В конце приведенного выше кода я получаю это изображение: введите здесь описание изображения

Кто-нибудь понимает, что здесь не так? Я схожу с ума.


person hevele    schedule 27.10.2013    source источник


Ответы (1)


Двух соответствующих точек недостаточно для определения аффинного преобразования. Вам нужно минимум 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 );
person Shai    schedule 27.10.2013
comment
Да, большое спасибо. Это сработало. Но можете ли вы мне объяснить, что делает? Поскольку я не должен использовать такие инструменты, мне нужно выполнять работу вручную. В своем коде я пытался найти точки и составить уравнения. После решения и нахождения аффинной матрицы я применяю преобразование к каждому пикселю изображения. - person hevele; 27.10.2013
comment
Какую часть вы должны делать вручную? найти соответствующие точки? оцените трансформацию? преобразовать изображение? - person Shai; 27.10.2013