matlab单目相机标定后的图片矫正

本文详细介绍了如何使用Matlab进行相机标定,包括获取内参数和外参数,以及利用双线性插值技术对带有畸变的图像进行矫正,最后展示了校准前后图像的对比。
摘要由CSDN通过智能技术生成

matlab棋盘法相机标定后得到内外参数,如下图所示内参数k

fx = K(1,1); %f/dx    x轴和y轴上的焦距
fy = K(2,2); %f/dy
cx = K(3,1); %u0    图像中心的像素坐标是(u0,v0)
cy = K(3,2); %vo

根据归一化和去归一化得到矫正后的坐标

再根据双线性插值确保图像更加平整顺滑

例图如下

完整代码如下

filename = 'd1.png'; % 替换为你需要矫正图像文件名  
 
% 使用imread读取图像文件  
img = imread(filename);   
K=params.IntrinsicMatrix;
D=params.Intrinsics.RadialDistortion;
fx = K(1,1); %f/dx    x轴和y轴上的焦距
fy = K(2,2); %f/dy
cx = K(3,1); %u0    图像中心的像素坐标是(u0,v0)
cy = K(3,2); %vo
 
% function undistorted_img = undistortImage(img, K, D) 
[height, width, ~] = size(img);

% 创建一个与输入图像大小相同的空白图像
undistorted_img = uint8(zeros(height, width));
 
% 遍历图像的每个像素
for y = 1:height
    for x = 1:width
 
        % 归一化,像素坐标系→相机坐标系       
        x1 = (x-cx)/fx;  
        y1 = (y-cy)/fy;%(x, y) 是畸变图像中的像素坐标。
        % 图像中心的像素坐标是(u0,v0),fx 和 fy 是相机的焦距。
        
        % 归一化的去径向畸变像点坐标(相机坐标系)
        r2 = x1^2 + y1^2;
        x2  = x1 * (1 + D(1) * r2 + D(2) * r2^2); 
        y2 = y1 * (1 + D(1) * r2 + D(2) * r2^2);
        
        % 第三步,去归一化,得到畸变坐标,像素坐标
        u = fx * x2 + cx;  %列
        v = fy * y2 + cy;  %行
        
        %检查坐标是否在图像范围内
        if u>=1 && v>=1 && u<=width && v<=height

            %取整并计算偏移量 
            x0 = floor(u);
            y0 = floor(v);
            dx = u - x0;
            dy = v - y0; 
            
   % 四个相邻像素点的值  
                Q11 = img(y0, x0);  
                Q12 = img(y0, x0+1);  
                Q21 = img(y0+1, x0);  
                Q22 = img(y0+1, x0+1);  
 
   % 双线性插值方法计算去畸变后图像的像素值。
            undistorted_img(y,x) = (1-dx)*(1-dy)*Q11 + dx*(1-dy)*Q12 + (1-dx)*dy*Q21 + dx*dy*Q22;
        end
    end
end

 figure('Units', 'pixels', 'Position', [300,300,1000, 1000])
 imshowpair(imresize(img ,0.5),imresize(undistorted_img,0.5),'montage');
 title('畸变图像与去畸变图像对比');  

filename = 'd1.png'; % 
 
% 使用imread读取图像文件  
img = imread(filename);   
K=params.IntrinsicMatrix;
D=params.Intrinsics.RadialDistortion;
fx = K(1,1); %f/dx    x轴和y轴上的焦距
fy = K(2,2); %f/dy
cx = K(3,1); %u0    图像中心的像素坐标是(u0,v0)
cy = K(3,2); %vo
 
% function undistorted_img = undistortImage(img, K, D) 
[height, width, ~] = size(img);

% 创建一个与输入图像大小相同的空白图像
undistorted_img = uint8(zeros(height, width));
 
% 遍历图像的每个像素
for y = 1:height
    for x = 1:width
 
        % 归一化,像素坐标系→相机坐标系       
        x1 = (x-cx)/fx;  
        y1 = (y-cy)/fy;%(x, y) 是畸变图像中的像素坐标。
        % 图像中心的像素坐标是(u0,v0),fx 和 fy 是相机的焦距。
        
        % 归一化的去径向畸变像点坐标(相机坐标系)
        r2 = x1^2 + y1^2;
        x2  = x1 * (1 + D(1) * r2 + D(2) * r2^2); 
        y2 = y1 * (1 + D(1) * r2 + D(2) * r2^2);
        
        % 第三步,去归一化,得到畸变坐标,像素坐标
        u = fx * x2 + cx;  %列
        v = fy * y2 + cy;  %行
        
        %检查坐标是否在图像范围内
        if u>=1 && v>=1 && u<=width && v<=height

            %取整并计算偏移量 
            x0 = floor(u);
            y0 = floor(v);
            dx = u - x0;
            dy = v - y0; 
            
   % 四个相邻像素点的值  
                Q11 = img(y0, x0);  
                Q12 = img(y0, x0+1);  
                Q21 = img(y0+1, x0);  
                Q22 = img(y0+1, x0+1);  
 
   % 双线性插值方法计算去畸变后图像的像素值。
            undistorted_img(y,x) = (1-dx)*(1-dy)*Q11 + dx*(1-dy)*Q12 + (1-dx)*dy*Q21 + dx*dy*Q22;
        end
    end
end

 figure('Units', 'pixels', 'Position', [300,300,1000, 1000])
 imshowpair(imresize(img ,0.5),imresize(undistorted_img,0.5),'montage');
 title('畸变图像与去畸变图像对比');  

  • 20
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值