MATLAB实现基于仿射变换的图像变换的代码

时间:2023-02-07 12:23:54

算法框架和步骤可以以图像旋转算法为参考:点击跳转

要求:

算法实现为函数 [im]=aff(I,T),其中I为读入的图像矩阵;T为仿射变换矩阵。

参考测试代码:(顺时针旋转30度)

I =imread('peppers.png');

delta_ang = pi/3;

T1=[cos(delta_ang) sin(delta_ang) 0;

-sin(delta_ang) cos(delta_ang) 0;

0 0 1];

[im]= aff (I, T1) ; 

imshow(I);figure, imshow(im);


仿射变换公式:

i´= a*i+b*j+ai 
j´= c*i+d*j+aj


[i´,j´,1]= [i, j, 1][a b 0; c d 0;ai aj 1]; 

function [im] = aff(I,T)
[m,n,s] = size(I);
a = T(1,1);
b = T(1,2);
c = T(2,1);
d = T(2,2);
ai = T(3, 1);
aj = T(3,2);
i_min = round(min(min(min(min(a*m+b*n+ai,a*m+b*1+ai),a*1+b*n+ai),a*1+b*1+ai)));
i_max = round(max(max(max(max(a*m+b*n+ai,a*m+b*1+ai),a*1+b*n+ai),a*1+b*1+ai)));
j_min = round(min(min(min(min(c*m+d*n+aj,c*m+d*1+aj),c*1+d*n+aj),c*1+d*1+aj)));
j_max = round(max(max(max(max(c*m+d*n+aj,c*m+d*1+aj),c*1+d*n+aj),c*1+d*1+aj)));
y_m = 1 - i_min;
y_n = 1 - j_min;
m1 = abs(i_max - i_min)+1;
n1 = abs(j_max - j_min)+1;
B = -1*ones(m1,n1,1);
B = -1*ones(m1,n1,2);
B = -1*ones(m1,n1,3);

for i=1:m
for j=1:n
i1 = round(a*i+b*j+ai);
j1 = round(c*i+d*j+aj);
B(i1+y_m,j1+y_n,:) = I(i,j,:);
end
end

for i=1:m1
for j=1:n1
if(B(i,j,:)~=-1)
C(i,1,:) = j;
break;
end
end
end
for i=1:m1
for j=n1:-1:1
if(B(i,j,:)~=-1)
C(i,2,:) = j;
break;
end
end
end
for i=1:m1
start = C(i,1,:)+1;
send = C(i,2,:)-1;
for j=start:send
if(B(i,j,:)==-1)
B(i,j,:) = B(i,j-1,:);
end
end
end
im = uint8(B);

MATLAB实现基于仿射变换的图像变换的代码

MATLAB实现基于仿射变换的图像变换的代码

MATLAB实现基于仿射变换的图像变换的代码