目录
(3)仿射变换(Affine Transformation):
(1)最近邻插值(Nearest Neighbor Interpolation):
(2)双线性插值(Bilinear Interpolation):
(3)双三次插值(Bicubic Interpolation):
(4)三次样条插值(Cubic Spline Interpolation):
一、几何变换基础:
几何变换是图像处理中用于改变图像几何形状的一系列操作。它们通常用于校正图像、创建视觉效果或者为进一步的图像分析做准备。
(1)图像平移(Translation):
图像平移是几何变换中最简单的一种,它涉及到将图像中的每个像素点按照一定的向量移动。在二维空间中,如果我们有一个点 (x,y) ,我们想要将它平移到 (x′,y′) ,这个过程可以通过一个平移向量 (tx,ty) 来实现。
原理:
图像平移的基本原理是将图像中的每个像素点根据平移向量移动一定的距离。平移向量 (tx,ty) 指定了在x轴和y轴方向上的移动距离。平移操作不改变图像中像素点之间的相对位置,也不改变像素值。
公式推导:
对于一个原始图像中的点 (x,y) ,平移后的点 (x′,y′) 可以通过以下公式得到:
其中:
- x′和 y′是平移后点的坐标。
- tx和 ty是平移向量的分量,分别表示在x轴和y轴方向上的平移距离。
这个变换可以用一个2x3的矩阵来表示,称为平移矩阵:
在图像处理库如OpenCV中,通常使用仿射变换来实现平移,即使用一个2x3的矩阵与图像坐标进行矩阵乘法。对于一个点 (x,y) ,平移后的坐标可以通过以下矩阵乘法得到:
过程:
-
定义平移向量:首先确定你想要在x轴和y轴方向上移动图像的距离 txtx 和 tyty 。
-
构造平移矩阵:使用这些值构造一个2x3的平移矩阵。
-
应用平移矩阵:对于图像中的每个像素点,将其坐标表示为齐次坐标(即 (x,y,1)(x,y,1) ),然后与平移矩阵相乘,得到新的坐标。
-
插值:由于平移可能会导致新的坐标不是整数,因此需要使用插值方法来计算新位置的像素值。常用的插值方法包括最近邻插值、双线性插值等。
-
生成新图像:使用插值后的坐标值生成新图像。
- 通过这个过程,图像就被平移了指定的距离,而图像内容和像素值保持不变。
OpenCV变换过程:
- 创建一个平移矩阵。
- 使用
warpAffine
函数应用平移矩阵。
M = np.float32([[1, 0, tx], [0, 1, ty]]) # 平移矩阵
translated = cv2.warpAffine(src, M, (width, height))
(2)图像旋转(Rotation):
图像旋转是将图像围绕某一点旋转特定角度的几何变换。在二维空间中,图像旋转可以通过旋转矩阵来实现。以下是图像旋转的公式推导过程及原理。
原理:
图像旋转的基本原理是将图像中的每个像素点绕着旋转中心按照指定的角度进行旋转。这个过程保持图像中像素点之间的相对距离不变,但会改变像素点在图像坐标系中的位置。
公式推导:
假设我们有一个点P(x,y) 要绕着旋转中心 C(cx,cy)旋转 θ 角度。旋转后的点P′(x′,y′) 可以通过以下步骤得到:
-
将点平移到旋转中心:首先将点 P 平移到坐标原点,即计算点 P相对于旋转中心 C 的坐标:
-
应用旋转矩阵:然后应用二维旋转矩阵 R(θ)来计算旋转后的坐标:
-
将点平移回原位置:最后将旋转后的点 P′′平移到原来的坐标系中:
过程:
-
确定旋转中心和角度:首先确定旋转中心 C(cx,cy)C(cx,cy) 和旋转角度 θθ 。角度 θθ 可以是度或弧度,如果使用度,需要转换为弧度进行计算。
-
构造旋转矩阵:使用旋转角度 θθ 构造二维旋转矩阵 R(θ)R(θ) 。
-
应用旋转矩阵:对于图像中的每个像素点,将其坐标转换为相对于旋转中心的坐标,然后应用旋转矩阵,最后将坐标转换回原始坐标系。
-
插值:由于旋转可能会导致新的坐标不是整数,因此需要使用插值方法来计算新位置的像素值。常用的插值方法包括最近邻插值、双线性插值、三次样条插值等。
-
生成新图像:使用插值后的坐标值生成新图像。
- 通过这个过程,图像就被绕着指定的旋转中心旋转了指定的角度,而图像内容和像素值保持不变。在实际应用中,还需要考虑旋转后图像的边界处理,可能需要对图像进行适当的缩放或填充以避免图像信息的丢失。
OpenCV变换过程:
- 计算旋转矩阵。
- 使用
getRotationMatrix2D
获取旋转矩阵。 - 使用
warpAffine
函数应用旋转矩阵。
M = cv2.getRotationMatrix2D(center, angle, scale)
rotated = cv2.warpAffine(src, M, (width, height))
(3)仿射变换(Affine Transformation):
原理:
仿射变换是一种二维坐标到二维坐标之间的线性变换,它保持了图像中直线的平行性。这意味着,经过仿射变换后,原本平行的线仍然保持平行。仿射变换包括了旋转、缩放、剪切和平移等操作,这些操作可以组合使用以实现复杂的几何变换。
公式推导:
在二维空间中,一个点 P(x,y)经过仿射变换后变为 P′(x′,y′)。这个变换可以用一个2x3的矩阵 A 来表示,加上一个平移向量t来完成:
这里,a,b,c,d表示线性变换部分,而 tx,ty表示平移向量。
参数:
- a,b,c,d:线性变换参数,可以表示旋转、缩放和剪切。
- tx,ty:平移向量,表示在x轴和y轴方向上的平移距离。
注意事项:
- 仿射变换不保持角度和长度,但保持平行性。
- 在实际应用中,需要确保变换后的图像尺寸足够大,以包含所有变换后的像素点。
- 插值方法的选择对图像质量有重要影响,常用的插值方法包括最近邻插值、双线性插值等。
OpenCV变换过程:
- 选择三个点及其对应的目标位置。
- 使用
getAffineTransform
获取仿射变换矩阵。 - 使用
warpAffine
函数应用仿射变换矩阵。
M = cv2.getAffineTransform(srcTri, dstTri)
affine = cv2.warpAffine(src, M, (width, height))
(4)图像放缩(Scaling):
原理:
图像放缩是一种基本的图像处理操作,用于改变图像的尺寸,可以是等比例放缩(各向同性),也可以是不等比例放缩(各向异性)。放缩操作通过改变图像中像素点的间隔来实现,从而改变图像的分辨率。
公式推导:
假设原始图像的坐标为 (x,y),放