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('畸变图像与去畸变图像对比');