人脸几何校正 matlab,利用多项式实现图像几何校正(Matlab实现)

1.原理简述:

根据两幅图像中的一些已知对应点(控制点对),建立函数关系式,通过坐标变换,实现失真图像的几何校正。

1eed593754fe67ebeeb52fc244e572f7.png

设两幅图像坐标系统之间畸变关系能用解析式来描述:

cb60e0e82e3f4dead23a9bb28d3ffca2.png

根据上述的函数关系,可以依次计算畸变图像每个像素的矫正坐标值,保持各像素值不变,这样生成一幅矫正图像。

2.实现过程:

(1)因此首先要得到多项式,matlab提供了拟合多项式的函数 Isqcurvefit,

格式:lsqcurvefit(f,a,x,y)

f:符号函数句柄

a:最开始预估的值(预拟合的未知参数的估计值)。如上面的问题如果我们预估A为1,B为2,则a=[1 2]

x:我们已经获知的x的值

y:我们已经获知的x对应的y的值

函数的返回值为对应多项式系数组成的一维数组。

示例(二次多项式):建立由校正图像到畸变图像的函数

function [F] =fun(a,b)

x= b(:,1);

y= b(:,2);

F= a(1)+a(2)*x+a(3)*y+a(4)*x.^2+a(5)*x.*y+a(6)*y.^2; end

x0= fixedPoints(:,1);

y0= fixedPoints(:,2);

x1= movingPoints(:,1);

y1= movingPoints(:,2);

data=[x1,y1];

a= [1 1 1 1 1 1];

a1= lsqcurvefit('fun',a,data,x0);

a2= lsqcurvefit('fun',a,data,y0);

(2)根据得到的二项式,由校正图像每个像素坐标(x,y)出发,算出在已知畸变图像上的对应坐标(x',y'),使像元一一对应,赋予校正图像对应畸变图像的像元

的像素值,最终得到校正图像。

示例:

J2 =uint8(zeros(size(J)));for rgb = 1:3

for i = 1:mfor j = 1:nif round(fun(a1,[i,j]))>=1 && round(fun(a1,[i,j]))<=c && round(fun(a2,[i,j]))>=1 && round(fun(a2,[i,j]))<=d

J2(i,j,rgb)=J1(round(fun(a1,[i,j])),round(fun(a2,[i,j])),rgb);

endend

end

end

这样生成的图像像素分布不规则,会出现像素挤压、疏密不均的现象,因此最后还需对不规则图像进行灰度内插生成规则的栅格图像。

源码:

I = imread('sp.tif');

J= imread('tm.tif');

[m,n]=size(J);

[o,p]=size(I);%cpselect(J,I);%xlswrite('data1.xls',fixedPoints);%xlswrite('data2.xls',movingPoints);%%重采样

J1= J(1:m/o:end,1:n/p:end,1:3);

[c,d,q]=size(J1);

fixedPoints= xlsread('data1.xls');

movingPoints= xlsread('data2.xls');

x0= fixedPoints(:,1);

y0= fixedPoints(:,2);

x1= movingPoints(:,1);

y1= movingPoints(:,2);

data=[x1,y1];

a= [1 1 1 1 1 1];

a1= lsqcurvefit('fun',a,data,x0);

a2= lsqcurvefit('fun',a,data,y0);%多项式几何校正

J2=uint8(zeros(size(J)));for rgb = 1:3

for i = 1:mfor j = 1:nif round(fun(a1,[i,j]))>=1 && round(fun(a1,[i,j]))<=c && round(fun(a2,[i,j]))>=1 && round(fun(a2,[i,j]))<=d

J2(i,j,rgb)=J1(round(fun(a1,[i,j])),round(fun(a2,[i,j])),rgb);

end% J2(round(fun(a1,[i,j])),round(fun(a2,[i,j]))) =J(i,j);%end

end

end

end

[x,y]=size(J2);%根据数据游标取截取区域的左上方点

J3= imcrop(I,[98 180 60*o/x 60*p/y]);

J4= imcrop(J2,[41 80 60 60]);

[k,y,z]=size(J3);

[h,t,e]=size(J4);%%重采样%双线性内插法

u= h/k;

v= t/y;

itp= uint8(zeros(k,y,3));for rgb = 1:3

for i = ceil(1/u):k-1iu= floor(i*u);for j = ceil(1/v):y-1jv= floor(j*v);

itp(i,j,rgb)= (1-(i*u-iu))*(1-(j*v-jv))*J4(iu,jv,rgb)...+(1-(i*u-iu))*(j*v-jv)*J4(iu,jv+1,rgb)...+(i*u-iu)*(1-(j*v-jv))*J4(iu+1,jv,rgb)...+(i*u-iu)*(j*v-jv)*J4(iu+1,jv+1,rgb);

end

end

end%去黑边for rgb = 1:3

for i = 1:3

for j = 1:175itp(i,j,rgb)= J4(ceil(i*u),ceil(j*v),rgb);

itp(145,j,rgb) = J4(43,ceil(j*v),rgb);

end

endfor j = 1:2

for i = 1:145itp(i,j,rgb)= J4(ceil(i*u),ceil(j*v),rgb);

itp(i,175,rgb) = J4(ceil(i*u),61,rgb);

end

end

end

imwrite(J3,'Core1.bmp','bmp');

imwrite(itp,'Core2.bmp','bmp');

subplot(231),imshow(J),title('待配准图像');

subplot(232),imshow(I),title('基准图像');

subplot(233),imshow(J2),title('多项式几何校正后');

subplot(234),imshow(J3),title('基准影像裁剪后');

subplot(235),imshow(itp),title('校正影像裁剪重采样后');% %基准图重采样% kh =zuixiaogongbeishu(k,h);% yt =zuixiaogongbeishu(y,t);% u = h/kh;v = t/yt;% J5 = J3(1:k/kh:end,1:y/yt:end,1:3);% %配准图 双线性内插法重采样% itp = uint8(zeros(kh,yt,3));% for rgb = 1:3

% for i = floor(1/u):kh-1

% iu = floor(i*u);% for j = floor(1/v):yt-1

% jv = floor(j*v);% itp(i,j,rgb) = (1-(i*u-iu))*(1-(j*v-jv))*J4(iu,jv,rgb)...% +(1-(i*u-iu))*(j*v-jv)*J4(iu,jv+1,rgb)...% +(i*u-iu)*(1-(j*v-jv))*J4(iu+1,jv,rgb)...% +(i*u-iu)*(j*v-jv)*J4(iu+1,jv+1,rgb);%end%end%end% %去黑边% for rgb = 1:3

% for i = 1:144

% for j = 1:10675

% itp(i,j,rgb) = J4(ceil(i*u),ceil(j*v),rgb);%end%end% for j = 1:175

% for i = 1:6235

% itp(i,j,rgb) = J4(ceil(i*u),ceil(j*v),rgb);%end%end%end%

% itp1 = uint8(zeros(6193,10615,3));% itp1(1:6193,1:10615,1:3) = itp(1:6193,1:10615,1:3);% imwrite(J5,'Crop1.bmp','bmp');% J5 = imread('Crop1.bmp');% imwrite(itp1,'Crop2.bmp','bmp');% J6 = imread('Crop2.bmp');% subplot(231),imshow(J),title('待配准图像');% subplot(232),imshow(I),title('基准图像');% subplot(233),imshow(J2),title('多项式几何校正后');% subplot(234),imshow(J5),title('基准影像裁剪重采样后');% subplot(235),imshow(J6),title('校正影像裁剪重采样后');% a = imread('基准.bmp');% b = imread('重采样后图像.bmp');% c = imcrop(a,[1,100,100,100]);% d = imcrop(b,[1,100,100,100]);% imwrite(c,'Core3.bmp','bmp');% imwrite(d,'Core4.bmp','bmp');

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值