把拍摄的倾斜的照片正过来

写了一个做简单的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

 

posted on 2015-06-13 15:25  cutepig  阅读(911)  评论(0编辑  收藏  举报

导航