设为首页收藏本站

EPS数据狗论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1484|回复: 0

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

[复制链接]

20

主题

159

金钱

262

积分

入门用户

发表于 2019-6-17 14:17:17 | 显示全部楼层 |阅读模式

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

  2.                                    ![1704593-20190607214039234-614794812.jpg][]



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

  4.                           ![1704593-20190607214412623-284507974.png][]

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


2.实现过程:
  1. (1)因此首先要得到多项式,matlab提供了拟合多项式的函数 Isqcurvefit,
复制代码

** 格式**:lsqcurvefit(f,a,x,y)
  1.    f:符号函数句柄

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

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

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

  5.            函数的返回值为对应多项式系数组成的一维数组。
复制代码

示例(二次多项式):建立由校正图像到畸变图像的函数
  1. function [F] = fun(a,b)
  2. x = b(:,1);
  3. y = b(:,2);
  4. F = a(1)+a(2)*x+a(3)*y+a(4)*x.^2+a(5)*x.*y+a(6)*y.^2;
  5. end


  6. x0 = fixedPoints(:,1);
  7. y0 = fixedPoints(:,2);
  8. x1 = movingPoints(:,1);
  9. y1 = movingPoints(:,2);
  10. data = [x1,y1];
  11. a = [1 1 1 1 1 1];
  12. a1 = lsqcurvefit('fun',a,data,x0);
  13. a2 = lsqcurvefit('fun',a,data,y0);

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

的像素值,最终得到校正图像。
示例:
  1. J2 = uint8(zeros(size(J)));
  2. for rgb = 1:3
  3.     for i = 1:m
  4.         for j = 1:n
  5.             if round(fun(a1,[i,j]))>=1 && round(fun(a1,[i,j]))<=c && round(fun(a2,[i,j]))>=1 && round(fun(a2,[i,j]))<=d
  6.                  J2(i,j,rgb) = J1(round(fun(a1,[i,j])),round(fun(a2,[i,j])),rgb);
  7.             end
  8.         end
  9.     end
  10. end
复制代码

** ** 这样生成的图像像素分布不规则,会出现像素挤压、疏密不均的现象,因此最后还需对不规则图像进行灰度内插生成规则的栅格图像。
源码:
  1. I = imread('sp.tif');
  2. J = imread('tm.tif');
  3. [m,n] = size(J);
  4. [o,p] = size(I);
  5. %cpselect(J,I);
  6. %xlswrite('data1.xls',fixedPoints);
  7. %xlswrite('data2.xls',movingPoints);


  8. %%重采样
  9. J1 = J(1:m/o:end,1:n/p:end,1:3);
  10. [c,d,q]= size(J1);

  11. fixedPoints = xlsread('data1.xls');
  12. movingPoints = xlsread('data2.xls');
  13. x0 = fixedPoints(:,1);
  14. y0 = fixedPoints(:,2);
  15. x1 = movingPoints(:,1);
  16. y1 = movingPoints(:,2);
  17. data = [x1,y1];
  18. a = [1 1 1 1 1 1];
  19. a1 = lsqcurvefit('fun',a,data,x0);
  20. a2 = lsqcurvefit('fun',a,data,y0);
  21. %多项式几何校正
  22. J2 = uint8(zeros(size(J)));
  23. for rgb = 1:3
  24.     for i = 1:m
  25.         for j = 1:n
  26.             if round(fun(a1,[i,j]))>=1 && round(fun(a1,[i,j]))<=c && round(fun(a2,[i,j]))>=1 && round(fun(a2,[i,j]))<=d
  27.                  J2(i,j,rgb) = J1(round(fun(a1,[i,j])),round(fun(a2,[i,j])),rgb);
  28.             end
  29.     %           J2(round(fun(a1,[i,j])),round(fun(a2,[i,j]))) = J(i,j);
  30.     %           end
  31.         end
  32.     end
  33. end
  34. [x,y] = size(J2);

  35. %根据数据游标取截取区域的左上方点
  36. J3 = imcrop(I,[98 180 60*o/x 60*p/y]);
  37. J4 = imcrop(J2,[41 80 60 60]);
  38. [k,y,z] = size(J3);
  39. [h,t,e] = size(J4);

  40. %%重采样
  41. %双线性内插法
  42. u = h/k;
  43. v = t/y;
  44. itp = uint8(zeros(k,y,3));
  45. for rgb = 1:3
  46.     for i = ceil(1/u):k-1
  47.         iu = floor(i*u);
  48.         for j = ceil(1/v):y-1
  49.             jv = floor(j*v);
  50.             itp(i,j,rgb) = (1-(i*u-iu))*(1-(j*v-jv))*J4(iu,jv,rgb)...
  51.                        +(1-(i*u-iu))*(j*v-jv)*J4(iu,jv+1,rgb)...
  52.                        +(i*u-iu)*(1-(j*v-jv))*J4(iu+1,jv,rgb)...
  53.                        +(i*u-iu)*(j*v-jv)*J4(iu+1,jv+1,rgb);
  54.         end
  55.     end
  56. end
  57. %去黑边
  58. for rgb = 1:3
  59.     for i = 1:3
  60.         for j = 1:175
  61.           itp(i,j,rgb) = J4(ceil(i*u),ceil(j*v),rgb);
  62.           itp(145,j,rgb) = J4(43,ceil(j*v),rgb);
  63.         end
  64.     end
  65.     for j = 1:2
  66.         for i = 1:145
  67.            itp(i,j,rgb) = J4(ceil(i*u),ceil(j*v),rgb);
  68.            itp(i,175,rgb) = J4(ceil(i*u),61,rgb);
  69.         end
  70.     end
  71. end
  72. imwrite(J3,'Core1.bmp','bmp');
  73. imwrite(itp,'Core2.bmp','bmp');

  74. subplot(231),imshow(J),title('待配准图像');
  75. subplot(232),imshow(I),title('基准图像');
  76. subplot(233),imshow(J2),title('多项式几何校正后');        
  77. subplot(234),imshow(J3),title('基准影像裁剪后');
  78. subplot(235),imshow(itp),title('校正影像裁剪重采样后');



  79. % %基准图重采样
  80. % kh = zuixiaogongbeishu(k,h);
  81. % yt = zuixiaogongbeishu(y,t);
  82. % u = h/kh;v = t/yt;
  83. % J5 = J3(1:k/kh:end,1:y/yt:end,1:3);
  84. % %配准图 双线性内插法重采样
  85. % itp = uint8(zeros(kh,yt,3));
  86. % for rgb = 1:3
  87. %     for i = floor(1/u):kh-1
  88. %         iu = floor(i*u);
  89. %         for j = floor(1/v):yt-1
  90. %             jv = floor(j*v);
  91. %             itp(i,j,rgb) = (1-(i*u-iu))*(1-(j*v-jv))*J4(iu,jv,rgb)...
  92. %                        +(1-(i*u-iu))*(j*v-jv)*J4(iu,jv+1,rgb)...
  93. %                        +(i*u-iu)*(1-(j*v-jv))*J4(iu+1,jv,rgb)...
  94. %                        +(i*u-iu)*(j*v-jv)*J4(iu+1,jv+1,rgb);
  95. %         end
  96. %     end
  97. % end
  98. % %去黑边
  99. % for rgb = 1:3
  100. %     for i = 1:144
  101. %         for j = 1:10675
  102. %           itp(i,j,rgb) = J4(ceil(i*u),ceil(j*v),rgb);
  103. %         end
  104. %     end
  105. %     for j = 1:175
  106. %         for i = 1:6235
  107. %            itp(i,j,rgb) = J4(ceil(i*u),ceil(j*v),rgb);
  108. %         end
  109. %     end
  110. % end
  111. %
  112. % itp1 = uint8(zeros(6193,10615,3));
  113. % itp1(1:6193,1:10615,1:3) = itp(1:6193,1:10615,1:3);
  114. % imwrite(J5,'Crop1.bmp','bmp');
  115. % J5 = imread('Crop1.bmp');
  116. % imwrite(itp1,'Crop2.bmp','bmp');
  117. % J6 = imread('Crop2.bmp');

  118. % subplot(231),imshow(J),title('待配准图像');
  119. % subplot(232),imshow(I),title('基准图像');
  120. % subplot(233),imshow(J2),title('多项式几何校正后');        
  121. % subplot(234),imshow(J5),title('基准影像裁剪重采样后');
  122. % subplot(235),imshow(J6),title('校正影像裁剪重采样后');

  123. % a = imread('基准.bmp');
  124. % b = imread('重采样后图像.bmp');
  125. % c = imcrop(a,[1,100,100,100]);
  126. % d = imcrop(b,[1,100,100,100]);
  127. % imwrite(c,'Core3.bmp','bmp');
  128. % imwrite(d,'Core4.bmp','bmp');
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

客服中心
关闭
在线时间:
周一~周五
8:30-17:30
QQ群:
653541906
联系电话:
010-85786021-8017
在线咨询
客服中心

意见反馈|网站地图|手机版|小黑屋|EPS数据狗论坛 ( 京ICP备09019565号-3 )   

Powered by BFIT! X3.4

© 2008-2028 BFIT Inc.

快速回复 返回顶部 返回列表