一、概述
图像畸变矫正是图像处理中的关键任务,主要用于修正因镜头畸变或拍摄角度导致的图像失真。其核心在于几何变换,通过数学模型将失真的像素映射回理想位置。
1. 图像畸变的类型
常见的畸变主要分为两类:
- 径向畸变(Radial Distortion):表现为图像中心到边缘的变形。典型如'桶形畸变'(边缘向外膨胀)和'枕形畸变'(边缘向内收缩)。
- 切向畸变(Tangential Distortion):通常由镜头装配不精确引起,导致图像出现不规则的切向偏移。
2. 畸变矫正原理
矫正的目标是恢复图像的几何结构。我们通常采用以下模型进行建模:
(1)径向畸变模型
公式如下:

其中 $r$ 是像素到图像中心的距离,$k_1, k_2$ 为径向畸变系数。
(2)切向畸变模型
切向畸变的矫正公式可表示为:

这里 $p_1$ 和 $p_2$ 是切向畸变参数。
(3)实现顺序
建议先矫正径向畸变,再处理切向畸变。因为径向畸变对几何形状影响更大,优先消除主要偏差能减少后续计算的干扰。
MATLAB 提供了强大的工具箱支持这一过程,一般步骤包括相机标定获取内参和畸变系数,随后利用这些参数进行图像矫正。
二、MATLAB 具体实现
在 FPGA 部署前,通常先用 MATLAB 计算逆向映射表,生成硬件所需的查找表(LUT)。核心逻辑如下:
% 读取畸变图像
img = imread('distorted_image.jpg');
[height, width, ~] = size(img);
% 相机标定参数:焦距和图像中心
f_x = 1000; % 水平焦距
f_y = 1000; % 垂直焦距
cx = width / 2; % 水平主点
cy = height / 2; % 垂直主点
% 畸变系数(径向和切向畸变系数)
k1 = -0.2;
k2 = 0.03;
p1 = 0.001;
p2 = -0.001;
% 创建一个空的矫正图像
undistorted_img = zeros(height, width, 3, 'uint8');
% 遍历每个像素点
for i = 1:height
for j = 1:width
% 计算像素点到图像中心的距离
x = j - cx;
y = i - cy;
% 转换到相机坐标系(单位:像素)
x_normalized = x / f_x;
y_normalized = y / f_y;
r = sqrt(x_normalized^2 + y_normalized^2);
% 计算径向畸变
radial_distortion = 1 + k1 * r^2 + k2 * r^4;
% 计算切向畸变
tangential_distortion_x = 2 * p1 * x_normalized * y_normalized + p2 * (r^2 + 2 * x_normalized^2);
tangential_distortion_y = p1 * (r^2 + 2 * y_normalized^2) + 2 * p2 * x_normalized * y_normalized;
% 计算畸变后的坐标(相机坐标系)
x_prime_normalized = x_normalized * radial_distortion + tangential_distortion_x;
y_prime_normalized = y_normalized * radial_distortion + tangential_distortion_y;
% 转换回像素坐标系
x_prime = x_prime_normalized * f_x + cx;
y_prime = y_prime_normalized * f_y + cy;
% 将畸变后的坐标转换为图像坐标系中的整数值
x_prime_img = round(x_prime);
y_prime_img = round(y_prime);
% 检查坐标是否在图像范围内
if x_prime_img >= 1 && x_prime_img <= width && y_prime_img >= 1 && y_prime_img <= height
undistorted_img(y_prime_img, x_prime_img, :) = img(i, j, :);
end
end
end
% 显示矫正后的图像
imshow(undistorted_img);













