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

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‘);

原文地址:https://www.cnblogs.com/liqinglong/p/10989400.html

时间: 2024-07-30 21:34:44

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

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

原创文章,欢迎转载.转载请注明:转载自 祥的博客 原文链接:http://blog.csdn.net/humanking7/article/details/46819527 在毕业设计的时候写论文画图,要在一个图像上精确的标记出要处理的区域,用Photoshop或是其他绘图软件难免不精确,而且也不符合懒人思维(以后怎么办,要一劳永逸,嘿嘿),所以就自己写软件吧. 编程思想和注意事项 其实程序的思路很简单,就是在局域外面像素的值(颜色)覆盖掉就行了,但是要注意几点内容. 原图像通道问题(边框颜色问

利用cvKMeans2()实现图像聚类(位置+颜色)

///利用opencv提供的函数cvKMeans2()实现图像聚类 ///////运行环境:VC6.0+opencv1.0 ///////////////使用的时候,改变flag的初始值,即可实现对灰度图.彩色图基于色彩的聚类,以及根据位置和色彩对彩色图像聚类. ////////////////最后结果显示的时候请注意pResult 和pResult3 #include "cv.h" #include "cxcore.h" #include "highgu

【信号、图像、Matlab】如何得到高斯滤波器的整数模板

[信号.图像.Matlab]如何得到高斯滤波器的整数模板 如何得到高斯滤波器的整数模板?这个问题困扰了我两天,上网搜索的代码,基本上都生成的小数,有的文档给写了3*3,5*5,7*7的整数形式,但是没有说是怎么得到的,应该说是我没有仔细看吧,现在恍然大悟,只要将左上角的元素化为1就可以了啊.我还以为用什么高级方法得出来的,晕死了. 二维高斯分布公式: 要得到高斯滤波器的整数模板就要从这个公式入手,这个公式在三维坐标下的形式是这样的: 我们要的高斯滤波器的整数模板相当于这个三维图形在底面(将底面网

摄像机标定用于机械臂抓举等(利用标定将图像上的点映射为三维坐标)

在实验室或者是工程上,我们常常需要将拍摄到的图像的二维图像坐标来计算三维坐标. 如上图所示,我们有上图这样的一副图片.我们需要将物体和机械臂的三维位置算出来,使得机械臂能够精确的抓住物体. 我们采用张正友标定的方法标定出内外参数,利用其内参与外参数算出其对应的三维坐标.具体公式略!可以参考张PAMI的论文. /*/ //author:YeahPingYE //function: //time:2014/11/25 // // // // // //*/ #include<highgui.h>

OpenCV利用矩阵实现图像旋转

利用OpenCV的矩阵操作实现图像的逆时针旋转90度操作 代码 Mat src = imread("C:\\Users\\fenggl\\Desktop\\测试.jpg",MREAD_UNCHANGED); imshow("原图", src); transpose(src, src); flip(src, src, 0); imshow("逆时针旋转90度", src); 效果 解释说明 第一步:读入原图 Mat src = imread(&qu

利用GDI+处理图像的色彩

首先先介绍一下ColorMatrix结构体:表示颜色的变换关系,定义如下: typedef struct { REAL m[5][5]; } ColorMatrix; ColorMatrix结构体一般和ImageAttribute类配合使用,使用的方式是先调用ImageAttibute::SetColorMatrix,运用该颜色变化矩阵,然后在绘制函数中将ImageAttribute对象作为DrawImage函数参数.以下的图像色彩变换都会用到这个结构体. 一.改变图像的透明度:只需要缩放Alp

在opencv3中利用SVM进行图像目标检测和分类

采用鼠标事件,手动选择样本点,包括目标样本和背景样本.组成训练数据进行训练 1.主函数 #include "stdafx.h" #include "opencv2/opencv.hpp" using namespace cv; using namespace cv::ml; Mat img,image; Mat targetData, backData; bool flag = true; string wdname = "image"; voi

利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了.不妨把应用的场景分为以下: 纸张四角的坐标(图中红点)已知的情况 也就是上面的左图中4个红点是可以准确获取,比如手动标注,那么就简单了:用OpenCV的Perspective Trans

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

http://www.vision.caltech.edu/bouguetj/calib_doc/ 这个网址是教程 问题一:No image in this directory in either ras, bmp, tif, pgm, ppm or jpg format. Change directory and try again. 原因:路径不对,当前路径下没有图片. 尝试:在matlab下尝试set path 到工作目录,但是并不起作用.用pwd命令显示的还是Matlab2014a\bi