图像变换——向前映射和向后映射

本文深入探讨了图像处理中的图像变换与映射原理,包括坐标变换、插值方法(向前映射与向后映射)、旋转变换及其应用,并通过OpenCV实现验证。重点介绍了插值算法在不同映射方法中的实现与效果比较。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,图像变换与映射
我们在进行图像处理时常常需要对图像进行变换。比如对图像进行缩放,旋转,平移等。图像变换的本质是将像素点的坐标通过某一种函数关系,映射到另外的位置。假设变换前图像为I(x,y),变换后图像为I’(x’,y’),则变换前后的图像之间存在下列关系

(xy)=(f(x,y)g(x,y))I(x,y)=I(x,y)=I(f(x,y),g(x,y))(1)
(xy)=(f1(x,y)g1(x,y))I(x,y)=I(x,y)=I(f1(x,y),g1(x,y))(2)

公式(1)我们已知原图像到目标图像的坐标变换(f(x,y),g(x,y)),因此我们可以知道原图像的一点在变换后在目标图像的位置,我们称为向前映射。
相反,公式(2)中我们知道目标图像的一点(x’,y’)在变换前在原图像上的位置(f1(x,y),g1(x,y)),我们称为向后映射。

二、插值:向前映射与向后映射
我们知道,通常情况下,一个整数位置(x,y)经过图像变换后,往往都位于非整数位置。此时就要采用插值技术。此时对于向前映射和向后映射,需要采取不同的策略。

下图为向前映射的示意图。输入图像上整数点坐标映射到输出图像之后,变成了非整数点坐标。因此,需要将其像素值按一定权重分配到其周围四个像素点上。对于输出图像而言,其整数点像素值周围会有很多输入图像像素映射过来,每个到其周围的非整数点像素值都会分配一定的灰度值到它上面,将这些分配而来的像素值叠加,就是输出图像整数点位置的像素值。由于这个分配、叠加的特性,向前映射法有时也叫像素移交映射。
向前映射
因此,对于向前映射而言,输出图像某一点的像素值不能直接得到,需要遍历输入图像的所有像素值,对其进行坐标变换,分配像素值到整数位置,才能得到输出图像各像素点的像素值。这是向前映射法的缺点。

相比之下,向后映射法就比较直观。在这种情况下,我们知道输出图像上整数点位置(x’,y’)在变换前位于输入图像上的位置(x,y),一般来说这是个非整数点位置,利用其周围整数点位置的输入图像像素值进行插值,就得到了该点的像素值。我们遍历输出图像,经过坐标变换、插值两步操作,我们就能将其像素值一个个地计算出来,因此向后映射又叫图像填充映射。如下图所示。
向后映射

插值算法我们采用双线性插值,如下图所示
双线性插值
这次我们先看向后插值。这种情况下输出图像上某点的像素值I’(x’,y’)映射到f(x,y),而f(x,y)由输入图像上四点像素值叠加而成

f(x,y)=(1x)(1y)f(0,0)+(1x)yf(0,1)+x(1y)f(1,0)+xyf(1,1)

很容易验证四个权重系数之和为1,插值后图像亮度不变。
对向前插值,输入图像某点I(x,y)变换到输出图像(x’,y’)的位置,因此需要将其像素值分配到f(0,0),f(0,1),f(1,0),f(1,1)四个位置。分配方式为
f(0,0)=(1x)(1y)f(x,y)f(0,1)=(1x)yf(x,y)f(1,0)=x(1y)f(x,y)f(1,1)=xyf(x,y)

对向前映射而言,虽然分配系数之和为1。但输出图像上每个点的像素值是多个分配值叠加而成的,不能保证所有分配到其上的权重之和为1。因此必须记录下所有分配到其上的权重并累加起来,最后利用累加权重进行归一化,才能得到正确的插值结果。

三、结果验证
利用旋转变换来严重上述理论,规定图像从左到右为x轴正方向,从上到下为y轴正方向,原点位于左上角。逆时针旋转为正。则图像的旋转变换公式为

(xy)=(αββα)(xy)+((1α)x0βy0βx0+(1α)y0)

其中α=scos(θ),β=ssin(θ),s为缩放系数。
利用上式我们很容易进行向前映射。
要进行向后映射,我们需要将上式稍作变换,改写成以(x’,y’)表示(x,y)的形式。
使用OpenCV进行编程,分别使用向前映射和向后映射方法进行旋转变换,以下为变换结果
原图片
原图片
旋转30°,向后映射
向后映射
旋转30°,向前映射
向前映射

四、总结
向后映射比较直观,计算量也小,我们经常使用的图像变换都是采用向后映射的方法来处理。但向后映射需要知道变换的反变换公式,在上面旋转变换的情况,反变换很容易求出来。但在有些变换比较复杂的场合,这个反变换是很难得到的。此时就需要采用前向映射的方法进行变换了。从实验结果看,向前映射得到的结果与向后映射是一样的。

### Halcon 中畸变系数的使用方法及参数说明 在 Halcon 中,畸变系数用于描述镜头成像过程中的几何失真情况。这些系数对于图像处理计算机视觉应用至关重要,因为它们能够帮助修正由透镜引起的图像变形。 #### 参数定义与分类 根据不同的相机模型,在 Halcon 中可以配置不同数量的畸变系数: - 对于 `area_scan_division` 类型的相机模型,通常只需要七个参数来表示基本的内部参数以及简单的径向畸变项[^3]。 ```cpp CameraParameters := ['area_scan_division', f, k, cell_width, cell_height, cx, cy, image_width, image_height] ``` - 如果选择了更复杂的 `area_scan_polynomial` 模型,则会引入额外的高阶径向畸变项 (k1, k2, k3) 两个切向畸变项 (p1, p2)。 ```cpp CameraParameters := ['area_scan_polynomial', f, k1, k2, k3, p1, p2, cell_width, cell_height, cx, cy, image_width, image_height] ``` 其中, - **f**: 表示焦距; - **cx**, **cy**: 图像中心坐标; - **cell_width**, **cell_height**: 像素尺寸; - **image_width**, **image_height**: 成像区域大小; - **k/k1-k3**: 径向畸变系数; - **p1-p2**: 切向畸变系数; 需要注意的是,Halcon 的畸变系数计算方式不同于 OpenCV 等其他库。具体来说,两者之间存在方向上的差异——即一个是从向后映射关系,另一个是从后向前的逆变换关系[^1]。 #### 实际操作指南 为了获取并利用这些畸变系数来进行后续处理工作,可以通过调用特定函数完成相应任务。例如,通过执行 `calibrate_cameras` 函数可以获得完整的内外部参数集,其中包括了上述提到的各种畸变因子[^4]。 ```hdevelop * 执行相机标定流程... gen_calib_data ('default', [], 'circle_grid', [rows], [cols], CalibDataID) add_calib_data_camera (CalibDataID, ...) grab_image_and_pose (... , Pose) calibrate_cameras ([...], [...], ..., CamParam) * 输出结果中包含了详细的畸变信息 disp_message(WindowHandle,'Distortion parameters: '+CamParam,'window','true') ``` 此代码片段展示了如何创建校准数据对象、添加摄像机信息、采集样本图片及其姿态,并最终获得经过优化调整后的全部内参矩阵(含畸变系数)。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值