Python-初学openCV——图像预处理(二)

目录

一、图像仿射变换

1、基本性质

[二、cv2.warpAffine() 函数](#二、cv2.warpAffine() 函数)

1、图像旋转

2、图像平移

3、图像缩放

4、图像剪切

[三、 插值方法](#三、 插值方法)

1、最近邻插值

2、双线性插值

3、像素区域插值

4、双三次插值

5、Lanczos插值


一、图像仿射变换

仿射变换(Affine Transformation)是一种线性变换,保持了点之间的相对距离不变

1、基本性质

保持直线

保持平行

比例不变性

不保持角度和长度

二、cv2.warpAffine() 函数

cv2.warpAffine() 是 OpenCV 中用来对图像进行仿射变换的函数。仿射变换是一种保 直线和比例的变换,可以包括平移、旋转、缩放和倾斜等操作

python 复制代码
#仿射变换函数
cv2.warpAffine(img,M,dsize)

参数:

img:输入图像

M:2x3的变换矩阵,类型为np.float32

dsize :输出图像的尺寸,形式为(width,height)

1、图像旋转

旋转图像可以将图像绕着某个点旋转一定的角度

cv2.getRotationMatrix2D()函数

python 复制代码
cv2.getRotationMatrix2D(center,angle,scale)

参数:

center :旋转中心点的坐标,格式为(x,y)

angle:旋转角度,单位为度,正值表示逆时针旋转、负值表示顺时针旋转

scale:缩放比例,若设为1,则不缩放

返回值(M):2x3的旋转矩阵

2、图像平移

平移操作可以将图像中的每个点沿着某个方向移动一定的距离

3、图像缩放

缩放操作可以改变图片的大小

4、图像剪切

剪切操作可以改变图形的形状,以便其在某个方向上倾斜,它将对象的形状改变为斜边 平行四边形,而不改变其面积

三、 插值方法

插值(Interpolation)是一种通过已知数据点之间的推断或估计来获取新数据点的方法,在图像处理中常用于处理图像的放大、缩小、旋转、变形等操作,以及处理图像中的像素值

图像插值算法是为了解决图像缩放或者旋转等操作时,由于像素之间的间隔不一致而导致的信息丢失和图像质量下降的问题。当我们对图像进行缩放或旋转等操作时,需要在新的像素位置上计算出对应的像素值,而插值算法的作用就是根据已知的像素值来推测未知位置的像素值

|------|-------|-----|------|-----------|
| 方法 | 邻域大小 | 平滑度 | 计算速度 | 适用场景 |
| 最近邻 | 1 x 1 | 最差 | 最快 | 像素艺术、实时预览 |
| 双线性 | 2 x 2 | 中等 | 中等 | 通用缩放 |
| 双三次 | 4 x 4 | 最佳 | 最慢 | 高质量放大/缩小 |
| 像素区域 | 动态区域 | 好 | 中等 | 缩小抗锯齿 |

1、最近邻插值

python 复制代码
CV2.INTER_NEAREST

原理与步骤

距离计算:对于待插值的位置(如图像中的非整数坐标点),计算它与所有已知数据点的距 离(通常用欧氏距离)。

最近点选择:找到距离最近的那个已知数据点。

赋值:直接将该最近点的值赋给待插值位置。

(最近邻插值适合对速度要求高、对质量要求低的场景)

2、双线性插值

python 复制代码
CV2.INTER_LINEAR

双线性插值(Bilinear interpolation)是图像缩放、旋转、几何校正中最常用的一种平滑插值方法 。它通过两次一维线性插值(先水平、后垂直)来计算目标点的值,避免了最近邻插值的"锯齿"问题

3、像素区域插值

python 复制代码
cv2.INTER_AREA

一种专为图像缩小(下采样)设计的插值方法。把目标图像的一个像素,反向映射回原图对应的一个"区域",然后取该区域所有原像素的平均值作为结果

缩小图像时,一个目标像素可能覆盖原图的多个像素(例如缩小 50% 时,1 个目标像素对应原图 2×2=4 个像素)像素区域插值通过"区域平均"强制抗锯齿,效果更自然

4、双三次插值

python 复制代码
cv2.INTER_CUBIC

双三次插值(Bicubic interpolation)是一种高阶、平滑 的二维插值方法,通过对目标点周围 16 个(4×4)已知像素 进行三次多项式加权 来得到插值结果。它是图像处理中放大图像时质量最好的算法之一

5、Lanczos插值

python 复制代码
cv2.INTER_LANCZOS4

Lanczos插值方法与双三次插值的思想是一样的,不同的就是其需要的原图像周围的像素点的范围变成了8*8,并且不再使用BiCubic函数来计算权重,而是换了一个公式计算权重