利用多项式实现图像几何校正(matlab实现)(代码片段)

liqinglong liqinglong     2022-12-17     806

关键词:

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能不能实现图像的几何校正?例如枕形或桶形畸变

...那个原因。用专业术语说就是找出图像的退化模型,然后利用退化模型对图像进行反变换就行了。matlab可以实现,但要颇费脑子才行。参考技术A上面那个回复讲了一堆废话什么都没讲这个就是计算机视觉里的摄像机标定可以用ma... 查看详情

利用envi对遥感图像校正

...产生精确的正射影像。2.2.ENVI正射校正概述ENVI支持RPC有理多项式系数(RationalPolynomialCoefficient)严格轨道物理模型的正 查看详情

利用envi对遥感图像校正

...产生精确的正射影像。2.2.ENVI正射校正概述ENVI支持RPC有理多项式系数(RationalPolynomialCoefficient)严格轨道物理模型的正 查看详情

基于gpu的高分一号影像正射校正的设计与实现

...像实现校正,这种方法属于近似几何纠正,主要有:几何多项式纠正、有理函数法、 查看详情

利用gdal实现影像的几何校正

一、概述   遥感影像和地理坐标进行关联的方式一般有好几种,一种是直接给出了仿射变换系数,即6个參数,左上角地理坐标,纵横方向上的分辨率,以及旋转系数。在这样的情况下,求出某一像素点的地理坐标非... 查看详情

rpc模型

...行批量的影像RPC正射校正3.4(Python)卫星RPC有理多项式模型读取与正反投影坐标计算原理与实现3.5高分影像批处理第三回——RPC文件与几何校正4.参考1.简介有理多项式系数(rationalpolynom 查看详情

拓端tecdat|图像倾斜校正算法的matlab代写实现:图像倾斜角检测及校正

图像倾斜校正算法的MATLAB实现:图像倾斜角检测及校正随着多媒体技术的不断发展,数码相机,高清拍照手机等多媒体设备己经在人们的生活中占据了越来越重要的地位。通过采用图像处理技术,可以将数码设备采集到的文字、... 查看详情

图像倾斜校正算法的matlab实现:图像倾斜角检测及校正

?原文链接:http://tecdat.cn/?p=13981 随着多媒体技术的不断发展,数码相机,高清拍照手机等多媒体设备己经在人们的生活中占据了越来越重要的地位。通过采用图像处理技术,可以将数码设备采集到的文字、图片等信息转化成... 查看详情

MATLAB 中的 Gamma 校正实现

】MATLAB中的Gamma校正实现【英文标题】:GammacorrectionimplementationinMATLAB【发布时间】:2019-10-1418:40:09【问题描述】:我正在尝试在MATLAB中执行伽马校正功能,至少可以说,我得到了一些好坏参半的结果。使用低于1的伽马常数(例... 查看详情

通过otsu算法实现条形码的角度矫正matlab仿真

...化数据采集中占重要地位,原始的采集均为一维采集,即利用红外光线等扫描器进行扫描,需要人工的进行对准,不仅费时,而且浪费人力,随着现代的摄像技术的不断发展,现在的条码可以直接通过摄像机采集整个的条码图像... 查看详情

fy-4a批量几何校正(基于gdal)(代码片段)

...介绍了FY-4A遥感影像的几何校正方法,然而其主体基于ENVI实现,虽然可以通过ENVI_DO_IT和IDL语言实现批量化处理,但由于ENVI中GLT的生成需要经纬度查找表没有无效值,需要裁剪,所以比较麻烦。​ 下面介绍一下基于gdal进行FY-4A几... 查看详情

如何利用opencv计算图像畸变系数,并进行校正与摄像机标定?

...一张图片可以根据图像中相关特征进行标定,简单讲就是利用:lineisstraight这个原理。2:目前最常用的方法,是通过二维标定板,通过对reprojectionerror最小化进行非线性优化,来实现对相机的标定。并非根据看似高大上的训练集... 查看详情

matlab实现拉格朗日函数,拉格朗日插值多项式

%拉格朗日插值多项式利用矩阵求解x=1:0.2:3;%已知数据点x坐标向量:xy=sin(x);%已知数据点x坐标向量:yx1=1.1:0.2:3.1;%插值点的x坐标:x1L=zeros(11,11);%另L矩阵为0fori=1:11A=ones(10,1);%另A矩阵为10行1列的矩阵x2=x;x2(i)=[];x2‘;%10行一列B=ones(1,11);... 查看详情

图像几何变换之平移(matlab)(代码片段)

G=imread(‘aini555.jpg‘);A=rgb2gray(G);se=translate(strel(1),[80,50]);B=imdilate(A,se);figure;subplot(1,2,1),subimage(A);title(‘原图像‘);subplot(1,2,2),subimage(B);title(‘图像平移‘);实现效果如下:  查看详情

matlab分数阶的预估校正算法及实现

1、内容简介略606-可以交流、咨询、答疑2、内容说明预估校正法预估校正法(predictor-correctormethod)是1993年公布的数学名词。 3、仿真分析       4、参考论文略 查看详情

Python基线校正库

...现我想要的了。如您所见,我试图在我的所有数据中拟合多项式,而我实际上应该只在局部最小值处拟合多项式。理想情况下,我希望有一个多项式拟合,从我的原始数据中减去它会导致如下结果:是否有 查看详情

图像复原matlab实现(代码片段)

...介绍滤波器滤除噪声,再介绍滤波器复原,侧重于程序的实现。一:三种常见的噪声   二:空间域滤波空间域滤波复原是在已知噪声模型的基础上,对噪声的空间域进行滤波。空间域滤波复原方法主要包括:  均值... 查看详情

相机标定与图像校正助手(vs+opencv+qt实现)(代码片段)

...包软件:InnoSetupCompiler链接库搜索软件:Everything实现功能:相机标定;图像校正界面分布:标定区;校正区;控制台;操作反馈;参数显示作者联系方式࿱ 查看详情