计算机视觉中的图像变换技术
立即解锁
发布时间: 2025-09-02 01:29:25 阅读量: 20 订阅数: 58 AIGC 


构建计算机视觉应用
### 计算机视觉中的图像变换技术
在计算机视觉领域,常常需要将图像转换为不同的形式。本文将通过一系列Python示例,介绍使用OpenCV库进行图像变换的多种技术,包括调整大小、平移、旋转、翻转、裁剪以及图像算术和位运算。
#### 1. 调整图像大小(Resizing)
调整图像大小是指增加或减少图像的高度和宽度。在调整图像大小时,需要记住一个重要概念——宽高比(aspect ratio),它是宽度与高度的比例,计算公式为:宽高比 = 宽度 / 高度。例如,正方形图像的宽高比为1:1,若图像高度为300px,宽度为600px,则宽高比为2:1。保持原始宽高比可以确保调整后的图像不会看起来拉伸或压缩。
OpenCV提供了`resize()`函数来实现两种不同的图像调整大小技术:
- **按像素调整到所需大小**:保持宽高比的情况下,若已知所需的图像高度,可以使用原始图像的宽高比计算相应的宽度。
- **按比例调整**:例如,将图像宽度扩大1.5倍或高度扩大2.5倍。
以下是使用`resize()`函数计算宽高比并调整图像大小的代码示例:
```python
# Image transformation using the resize() function
import cv2
import numpy as np
# Load image
imagePath = "images/zebra.png"
image = cv2.imread(imagePath)
# Get image shape which returns height, width, and channels as a tuple. Calculate the aspect ratio
(h, w) = image.shape[:2]
aspect = w / h
# let's resize the image to decrease height by half of the original image.
# Remember, pixel values must be integers.
height = int(0.5 * h)
width = int(height * aspect)
# New image dimension as a tuple
dimension = (height, width)
resizedImage = cv2.resize(image, dimension, interpolation=cv2.INTER_AREA)
cv2.imshow("Resized Image", resizedImage)
# Resize using x and y factors
resizedWithFactors = cv2.resize(image, None, fx=1.2, fy=1.2, interpolation=cv2.INTER_LANCZOS4)
cv2.imshow("Resized with factors", resizedWithFactors)
cv2.waitKey(0)
```
`resize()`函数的参数如下:
|参数|说明|
|----|----|
|第一个参数|由NumPy数组表示的原始图像|
|第二个参数|预期调整大小的维度,是一个表示调整后图像高度和宽度的整数元组。若要使用水平或垂直比例调整大小,则将此参数设为None|
|第三个和第四个参数(fx和fy)|水平(宽度方向)和垂直(高度方向)的调整比例,这两个参数是可选的|
|最后一个参数|插值算法,OpenCV内部用于调整图像大小的算法。OpenCV支持以下五种插值算法:|
| - INTER_LINEAR | 双线性插值,确定四个最近邻(2×2 = 4)并计算其加权平均值来确定下一个像素的值 |
| - INTER_NEAREST | 最近邻插值方法,通过考虑给定点周围(相邻)点的函数值来近似非给定点的函数值 |
| - INTER_CUBIC | 双三次插值算法,使用4×4 = 16个最近邻来确定下一个像素的值。在对速度要求不高时,双三次插值比双线性插值能得到更好的调整后图像 |
| - INTER_LANCZOS4 | 使用8×8最近邻插值 |
| - INTER_AREA | 通过使用像素面积关系(如OpenCV官方文档所述)计算像素值。使用此算法可创建无莫尔条纹的调整后图像。当图像尺寸增大时,INTER_AREA类似于INTER_NEAREST方法 |
#### 2. 图像平移(Translation)
图像平移是指沿x轴和y轴将图像向左、右、上或下移动。移动图像的过程涉及两个主要步骤:定义平移矩阵和调用OpenCV的`warpAffine()`函数。平移矩阵决定了移动的方向和幅度。
以下是图像沿x轴和y轴平移的代码示例:
```python
# Image translation using OpenCV's warpAffine() to move image along x- and y-axes
import cv2
import numpy as np
# Load image
imagePath = "images/soccer-in-green.jpg"
image = cv2.imread(imagePath)
# Define translation matrix
translationMatrix = np.float32([[1,0,50],[0,1,20]])
# Move the image
movedImage = cv2.warpAffine(image, translationMatrix, (image.shape[1], image.shape[0]))
cv2.imshow("Moved image", movedImage)
cv2.waitKey(0)
```
`warpAffine()`函数的参数如下:
- **第一个参数**:要移动的图像的NumPy表示。
- **第二个参数**:定义移动方向和移动量的平移矩阵。
- **第三个参数**:一个元组,包含要在其中移动图像的画布的宽度和高度。在本例中,画布大小与原始图像的高度和宽度相同。
平移矩阵是一个2×3矩阵或二维数组。例如,`[1,0,50]`表示沿x轴向右移动50个像素,若该数组的第三个元素为负数,则向左移动;`[0,1,20]`表示沿y轴向下移动20个像素,若该数组的第三个元素为负数,则向上移动。
#### 3. 图像旋转(Rotation)
要将图像旋转特定角度,首先需要使用OpenCV提供的`getRotationMatrix2D()`函数定义旋转矩阵。然后,使用`warpAffine()`函数执行实际的旋转操作。
以下是围绕图像中心旋转45度(顺时针)的代码示例:
```python
# Example code to demonstrate image rotation using OpenCV’s warpAffine function
import cv2
import numpy as np
# Load image
imagePath = "images/zebrasmall.png"
image = cv2.imread(imagePath)
(h,w) = image.shape[:2]
# Define translation matrix
center = (h//2, w//
```
0
0
复制全文
相关推荐









