1.原理简述:    

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

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

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

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:m
for j = 1:n
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
J2(i,j,rgb) = J1(round(fun(a1,[i,j])),round(fun(a2,[i,j])),rgb);
end
end
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:m
for j = 1:n
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
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-1
iu = floor(i*u);
for j = ceil(1/v):y-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:3
for j = 1:175
itp(i,j,rgb) = J4(ceil(i*u),ceil(j*v),rgb);
itp(145,j,rgb) = J4(43,ceil(j*v),rgb);
end
end
for j = 1:2
for i = 1:145
itp(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');

利用多项式实现图像几何校正(Matlab实现)的更多相关文章

  1. 非刚性图像配准 matlab简单示例 demons算法

    2011-05-25 17:21 非刚性图像配准 matlab简单示例 demons算法, % Clean clc; clear all; close all; % Compile the mex f ...

  2. 利用OpenCV给图像添加中文标注

    利用OpenCV给图像添加中文标注 : 参考:http://blog.sina.com.cn/s/blog_6bbd2dd101012dbh.html  和https://blog.csdn.net/ ...

  3. [图像]用Matlab在图像上画矩形框

    原创文章,欢迎转载.转载请注明:转载自 祥的博客 原文链接:http://blog.csdn.net/humanking7/article/details/46819527 在毕业设计的时候写论文画图 ...

  4. Python 利用GDAL对图像进行几何校正

    原文链接:https://blog.csdn.net/qq_27045589/article/details/81062586 一.几何校正方法 图像校正本质是建立一种从原始图像行列号到某种投影的数学 ...

  5. 利用GDI+处理图像的色彩

    首先先介绍一下ColorMatrix结构体:表示颜色的变换关系,定义如下: typedef struct { REAL m[][]; } ColorMatrix; ColorMatrix结构体一般和I ...

  6. OpenCV与Python之图像的读入与显示以及利用Numpy的图像转换

    1:读入图像,显示图像与保存图像 代码: import cv2 img=cv2.imread('lena.jpg',cv2.IMREAD_COLOR) cv2.namedWindow('lena',c ...

  7. OpenCV利用矩阵实现图像旋转

    利用OpenCV的矩阵操作实现图像的逆时针旋转90度操作 代码 Mat src = imread("C:\\Users\\fenggl\\Desktop\\测试.jpg",MREA ...

  8. 在利用手背扫描图像+K因子 对室内温度进行回归预测时碰到的问题

    1. 关于多输入流: 由于本Mission是双输入, 导师要求尽量能使用Inception之诸, 于是输入便成了问题. 思考: 在Github上找到了keras-inceptionV4进行对网络头尾的 ...

  9. 【图像】Matlab图像标定工具箱

    参考教程: Matlab工具箱教程  http://www.vision.caltech.edu/bouguetj/calib_doc/ 摄像机模型  http://oliver.zheng.blog ...

随机推荐

  1. SPDY: An experimental protocol for a faster web HTTP/2

    http://www.chromium.org/spdy/spdy-whitepaper https://en.wikipedia.org/wiki/SPDY Internet protocol su ...

  2. tornado之表单和模板

    之前在indexHandler中通过self.write()方法在对应的网页中写入具体的字符信息. 如果我们想直接返回一个网页那么这个时候就需要用到模板了 首先在工程目录下新建一个template文件 ...

  3. 在oc中一些常用的宏定义总结

    1.打印CGRect,Size,Point #define NSLogRect(rect) NSLog(@"%s x:%.4f, y:%.4f, w:%.4f, h:%.4f", ...

  4. 最大流EK算法

    给定一个有向图G=(V,E),把图中的边看作 管道,每条边上有一个权值,表示该管道 的流量上限.给定源点s和汇点t,现在假设 在s处有一个水源,t处有一个蓄水池,问从 s到t的最大水流量是多少? 网络 ...

  5. android中样式和自定义button样式

    1)自定义button样式 一.采用图片方式 首先新建Android XML文件,类型选Drawable,根结点选selector,自定义一个文件名. 随后,开发环境自动在新建的文件里加了select ...

  6. Appium java 环境配置

    一.安装node.js 下载地址:http://pan.baidu.com/s/1qYyNDm8 点击安装,next下一步就ok. 安装完成,命令行输入:npm 这样显示的话就ok了.  二.下载Ap ...

  7. centos 7 / 6 smokeping安装

    官网 值得拥有:http://oss.oetiker.ch/smokeping/doc/reading.en.html 安装依赖包 1 2 yum -y install perl perl-Net-T ...

  8. Protobuf入门实例

    Protobuf是一个灵活.高效.结构化的数据序列化框架,相比于XML等传统的序列化工具, 它更小.更快.更简单.Protobuf支持数据结构化一次就可以到处使用,甚至是跨语言使用,通过代码生成工具可 ...

  9. 加快你的JavaScript加载时间

    发现可以提速的内容 你必须首先发现你的什么图片和HTML加载缓慢了你的脚本速度,下面提供了方法: 1.  Firefox web-developer toolbar 2.  Firebug Plugi ...

  10. LA-3942(trie树+dp)

    题意: 给出一个由多个不同单词组成的字典,和一个长字符串,把这个字符串分解成若干个单词的连接,问有多少种方法; 思路: dp[i]表示s[i,L]的方案数,d[i]=∑d[j];s[i,j-1]是一个 ...