把拍摄的倾斜的照片正过来
写了一个做简单的affine transformation的程序,可以做一部分现行的纠正
最终理想是用户可以自定义一堆控制点,然后用户可以调整每一个控制点的期望位置,与此同时程序就动态的显示变化后的图像
难点是 1. 控制点调整算法? 2. UI, 包括显示控制点,确定用户选中与否,选中后计算用户移动
纠正之前的部分
纠正后的部分
代码
function main Im='F:\images\DCIM\Camera\IMG_20150517_181834.jpg'; I3 =imread(Im); I =I3(:,:,1); %PtIn=[2020 4; 3572 108/2; 2104 2228]'; %PtOut=[2020 4; 3572 4;2020 2228]'; PtIn=[807 282;1986 12; 807 1287]'; PtOut=[807 282;1986 282; 807 1287]'; T =my_get_affine_par(PtIn,PtOut); O =my_affine_trans(I, T, size(I)); imshow(uint8(O)) %IN, OUT: both are 2*3 matrix for 3 2d pts %T: 2*3 matrix,[OUT(:,i);1]=[T;0 0 1]*[IN(:,i);1] % % [xi [a1 b1 c1] [xo] % yi]= [a2 b2 c2] *[yo] % ==> % [xi] [xo yo 1 0 0 0] [a1] % [yi] = [0 0 0 xo yo 1] [b1] % [c1] % [a2] % [b2] % [c2] function T =my_get_affine_par(IN,OUT) A=[]; B=[]; for i=1:3 B=[B; OUT(:,i)]; A=[A; IN(:,i)' 1 0 0 0; 0 0 0 IN(:,i)' 1]; end X =A\B; T =[X(1:3)'; X(4:6)']; %transform a image %szO: size of out image function O =my_affine_trans(I, T, szO) szi =size(I); Tinv3=inv([T;0 0 1]); Tinv =Tinv3(1:2,:); O=zeros(szO); for y=1:size(O,1) for x=1:size(O,2) XYi=Tinv*[x;y;1]; xi=int32(XYi(1)); yi=int32(XYi(2)); if xi>0 & xi<=szi(2) & yi>0 & yi<=szi(1) O(y,x) =I(yi,xi); end end end