【修订版】本文已整理到我的个人博客,订正了原文的几处错误:旋转公式里的减号应为加号(原文与代码矛盾),坐标记号与倾斜系数的命名前后不一;示意图也已重新绘制。CSDN 这一版保留原样,之后的勘误与更新只在博客进行: Geometric Transform : 几何学变换与图像配准 | Finn's blog
1.图像的几何学变换
之前的博文里,我简单的介绍了图像的放大与缩小。放大与缩小也算是图像的几何学变换,本文介绍了其他的几何学变换,包括旋转、水平倾斜和垂直倾斜(当然,还有水平移动与垂直移动。这些变换很简单,不需要插值,所以这里就不着重介绍了)。
假设输入图像为G(u,v),其变换后的图像为F(x,y)。其变化的方法,如下所示。
图像的几何学变换,主要有两种向前映射与向后映射。
1.1向前映射
1.2 向后映射
1.3 上述两部分的Matlab代码
close all; clear all; clc; %% -----------Geometric_spatial_transform------------------ f = imread('./letter_T.tif'); f = mat2gray(f,[0 255]); [M,N] = size(f); %-----by forward mapping-----% g_fm = zeros(M,N); seta = -pi/8; for v = (-M/2):1:(M/2)-1 for w = (-N/2):1:(N/2)-1 x = round(v*cos(seta) - w*sin(seta)); y = round(v*sin(seta) + w*cos(seta)); if (((y>=(-N/2))&&(y<=(N/2)))&&((x>=(-M/2))&&(x<=(M/2)))) g_fm(x+(M/2)+1,y+(N/2)+1) = f(v+(M/2)+1,w+(N/2)+1); end end end figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image'); subplot(1,2,2); imshow(g_fm,[0 1]); xlabel('b).Ruselt of Geometric spatial transform'); %-----by inverse mapping---- g_im = zeros(M,N); seta = -pi/8; for x = (-M/2):1:(M/2)-1 for y = (-N/2):1:(N/2)-1 v = x*cos(-seta) - y*sin(-seta); w = x*sin(-seta) + y*cos(-seta); if (((w>=(-N/2)+1)&&(w<=(N/2)-1))&&((v>=(-M/2)+1)&&(v<=(M/2)-1))) %g_im(x+(M/2)+1,y+(N/2)+1) = 1;%f(round(v+(M/2)+1),round(w+(N/2)+1)); Q_11 = f(floor(v)+(M/2)+1,floor(w)+(N/2)+1); Q_21 = f(floor(v)+(M/2)+1,ceil(w)+(N/2)+1); Q_12 = f(ceil(v)+(M/2)+1,floor(w)+(N/2)+1); Q_22 = f(ceil(v)+(M/2)+1,ceil(w)+(N/2)+1); R1 = (Q_21 - Q_11)*(w-floor(w)) + Q_11; R2 = (Q_22 - Q_12)*(w-floor(w)) + Q_12; g_im(x+(M/2)+1,y+(N/2)+1) = (R2-R1)*(v-floor(v)) + R1; end end end figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image'); subplot(1,2,2); imshow(g_im,[0 1]); xlabel('b).Ruselt of Geometric spatial transform');2.图像的配准
close all; clear all; clc; %% --------------image registration--------------------------- f_Original = imread('./characters_test_pattern.tif'); f_Original = mat2gray(f_Original,[0 255]); [M,N] = size(f_Original); f = zeros(M+4,N+4); for x = 1:M f(x+2,:) = [0 0 f_Original(x,:) 0 0]; end [M,N] = size(f); s_v = 0.3; s_w = 0.02; P = round(M+s_v*N); Q = round(N+s_w*M); g_1 = zeros(P,N); for x = (-P/2):1:(P/2)-1 for y = (-N/2):1:(N/2)-1 v = x - s_v * y; w = y; if (((w>=(-N/2))&&(w<=(N/2)-1))&&((v>=(-M/2))&&(v<=(M/2)-1))) Q_11 = f(floor(v)+(M/2)+1,floor(w)+(N/2)+1); Q_21 = f(floor(v)+(M/2)+1,ceil(w)+(N/2)+1); Q_12 = f(ceil(v)+(M/2)+1,floor(w)+(N/2)+1); Q_22 = f(ceil(v)+(M/2)+1,ceil(w)+(N/2)+1); R1 = (Q_21 - Q_11)*(w-floor(w)) + Q_11; R2 = (Q_22 - Q_12)*(w-floor(w)) + Q_12; g_1(x+(P/2)+1,y+(N/2)+1) = (R2-R1)*(v-floor(v)) + R1; end end end g = zeros(P,Q); for x = (-P/2):1:(P/2)-1 for y = (-Q/2):1:(Q/2)-1 v = x; w = y - s_w * x; if (((w>=(-N/2))&&(w<=(N/2)-1))&&((v>=(-P/2))&&(v<=(P/2)-1))) Q_11 = g_1(floor(v)+(P/2)+1,floor(w)+(N/2)+1); Q_21 = g_1(floor(v)+(P/2)+1,ceil(w)+(N/2)+1); Q_12 = g_1(ceil(v)+(P/2)+1,floor(w)+(N/2)+1); Q_22 = g_1(ceil(v)+(P/2)+1,ceil(w)+(N/2)+1); R1 = (Q_21 - Q_11)*(w-floor(w)) + Q_11; R2 = (Q_22 - Q_12)*(w-floor(w)) + Q_12; g(x+(P/2)+1,y+(Q/2)+1) = (R2-R1)*(v-floor(v)) + R1; end end end figure(); subplot(1,2,1); imshow(f,[0 1]); xlabel('a).Original Image'); hold on; plot(621, 78,'ro','MarkerSize',7); plot(116,113,'ro','MarkerSize',7); plot( 85,649,'ro','MarkerSize',7); plot(624,641,'ro','MarkerSize',7); subplot(1,2,2); imshow(g,[0 1]); xlabel('b).Ruselt of Geometric spatial transform'); hold on; plot(625,264,'ro','MarkerSize',7); plot(116,147,'ro','MarkerSize',7); plot( 96,674,'ro','MarkerSize',7); plot(638,828,'ro','MarkerSize',7); %% f_reg = zeros(M,N); Original = [621-(N/2) 78-(M/2) (621-(N/2))*(78-(M/2)) 1; 116-(N/2) 113-(M/2) (116-(N/2))*(113-(M/2)) 1; 85-(N/2) 649-(M/2) (85-(N/2))*(649-(M/2)) 1; 624-(N/2) 641-(M/2) (624-(N/2))*(641-(M/2)) 1]; Ruselt = [625-(Q/2);116-(Q/2);96-(Q/2);638-(Q/2)]; c = (Original)\Ruselt; %C1~C4 Ruselt = [264-(P/2);147-(P/2);674-(P/2);828-(P/2)]; c = [c (Original)\Ruselt]; %C5~C8 wwwwww for y = (-M/2):1:(M/2)-1 for x = (-N/2):1:(N/2)-1 w = c(1,1)*y + c(2,1)*x + c(3,1)*x*y + c(4,1); v = c(1,2)*y + c(2,2)*x + c(3,2)*x*y + c(4,2); if (((w>=(-Q/2))&&(w<=(Q/2)-1))&&((v>=(-P/2))&&(v<=(P/2)-1))) Q_11 = g(floor(v)+(P/2)+1,floor(w)+(Q/2)+1); Q_21 = g(floor(v)+(P/2)+1,ceil(w)+(Q/2)+1); Q_12 = g(ceil(v)+(P/2)+1,floor(w)+(Q/2)+1); Q_22 = g(ceil(v)+(P/2)+1,ceil(w)+(Q/2)+1); R1 = (Q_21 - Q_11)*(w-floor(w)) + Q_11; R2 = (Q_22 - Q_12)*(w-floor(w)) + Q_12; f_reg(x+(N/2)+1,y+(M/2)+1) = (R2-R1)*(v-floor(v)) + R1; %g(round(v+(P/2)+1),round(w+(Q/2)+1)) = 0.5; end end end g_diff = abs(f - f_reg); figure(); subplot(1,2,1); imshow(f_reg,[0 1]); xlabel('c).Ruselt of image registration'); subplot(1,2,2); imshow(g_diff,[0 1]); xlabel('d).Difference image');