资源简介
有时候图像中拍的海报,视频,文件等因为拍摄角度问题,结果在图像中显示为任意四边形。该程序提供了一种将这个任意四边形转换为矩形的方法
代码片段和文件信息
%函数功能:中心投影变换。输入源图,源图中的任意四边形的4个点的坐标(左上,右上,左下,右下),以及输出图像的大小(高,宽)
function Imgback = m_PerspectiveTransformation(imgInpointLTpointRTpointLBpointRBoutHeithtoutWidth)
[imgInHeightimgInWidthimgInDimension] = size(imgIn);
%为了中心投影变换,需要将4个点转化为三个向量,具体看参考文献
vector10 = pointLB - pointLT;
vector01 = pointRT - pointLT;
vector11 = pointRB - pointLT;
%把vector11表示成vector10和vector01的线性组合,以使三个向量共面
A = [vector10‘ vector01‘];
B = vector11‘ ;
S = A\B;
a0 = S(1);
a1 = S(2);
%输出矩形
Imgback = uint8(zeros(outHeithtoutWidthimgInDimension));
%利用循环操作来对每个像素点赋值
for heightLoop = 1:outHeitht
for widthLoop = 1:outWidth
%以下算法为参考文献中的公式表示
x0 = heightLoop/outHeitht;
x1 = widthLoop/outWidth;
FenMu = a0+a1-1+(1-a1)*x0+(1-a0)*x1; %分母
y0 = a0*x0/FenMu;
y1 = a1*x1/FenMu;
%根据得到的参数找到对应的源图像中的坐标位置,并赋值
coordInOri = y0*vector10 + y1*vector01 + pointLT;
heightC = round(coordInOri(1));
widthC = round(coordInOri(2));
if (heightC > imgInHeight || heightC <= 0 || widthC >imgInWidth || widthC <=0 )
disp([‘m_PerspectiveTransformation超出范围‘ num2str(heightC) num2str(widthC)]);
pause();
return;
end
for dimentionLoop = 1:imgInDimension
%使用最近邻域插值,使用高级插值方法效果会更好
Imgback(heightLoopwidthLoopdimentionLoop) = imgIn(heightCwidthCdimentionLoop);
end
end
end
% figure; imshow(Imgback); title(‘投影变换的结果‘);
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 3241588 2017-06-15 22:19 1.jpg
文件 1921 2017-06-22 08:30 m_PerspectiveTransformation.m
文件 298 2017-06-22 15:55 Test_perspectivetransformation.m
文件 144 2017-07-07 20:01 说明.txt
评论
共有 条评论