图像预处理技术全解析
立即解锁
发布时间: 2025-09-06 01:27:44 阅读量: 11 订阅数: 37 AIGC 


Python机器学习实战指南
# 图像预处理技术全解析:从保存到特征提取
在计算机视觉领域,图像预处理是一项至关重要的任务,它为后续的图像分析和机器学习模型训练奠定了基础。本文将详细介绍一系列常见的图像预处理技术,包括图像的保存、调整大小、裁剪、模糊、锐化、对比度增强、颜色分离、二值化、背景去除、边缘检测和角点检测等,并提供相应的代码示例。
## 1. 保存图像
### 问题描述
在进行图像预处理之前,我们可能需要将图像保存到指定的文件路径。
### 解决方案
可以使用OpenCV的`imwrite`函数来保存图像。以下是具体的代码示例:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 以灰度模式加载图像
image = cv2.imread("images/plane.jpg", cv2.IMREAD_GRAYSCALE)
# 保存图像
cv2.imwrite("images/plane_new.jpg", image)
```
### 注意事项
- `imwrite`函数会根据文件名的扩展名来确定图像的格式,如`.jpg`、`.png`等。
- 如果指定的文件路径已经存在同名文件,`imwrite`函数会直接覆盖该文件,且不会输出错误信息或请求确认。
## 2. 调整图像大小
### 问题描述
在图像预处理中,为了使图像能够作为特征使用,通常需要将它们调整为相同的尺寸。
### 解决方案
可以使用`resize`函数来改变图像的大小。以下是代码示例:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 以灰度模式加载图像
image = cv2.imread("images/plane_256x256.jpg", cv2.IMREAD_GRAYSCALE)
# 将图像调整为50x50像素
image_50x50 = cv2.resize(image, (50, 50))
# 显示图像
plt.imshow(image_50x50, cmap="gray")
plt.axis("off")
plt.show()
```
### 调整图像大小的原因
- **标准化尺寸**:不同来源的图像可能具有不同的形状和大小,为了使它们能够作为特征使用,需要将它们调整为相同的尺寸。
- **减少内存占用**:在机器学习中,可能需要处理大量的图像数据。如果图像尺寸过大,会占用大量的内存。通过调整图像大小,可以显著减少内存的使用。
### 常见的图像尺寸
在机器学习中,常见的图像尺寸有32x32、64x64、96x96和256x256等。选择合适的图像尺寸通常需要在模型的统计性能和训练的计算成本之间进行权衡。
## 3. 裁剪图像
### 问题描述
有时候,我们可能只对图像的某一部分感兴趣,需要去除图像的外部部分来改变其尺寸。
### 解决方案
由于OpenCV将图像表示为二维NumPy数组,因此可以通过切片数组的方式轻松裁剪图像。以下是代码示例:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 以灰度模式加载图像
image = cv2.imread("images/plane_256x256.jpg", cv2.IMREAD_GRAYSCALE)
# 选择前半部分的列和所有行
image_cropped = image[:, :128]
# 显示图像
plt.imshow(image_cropped, cmap="gray")
plt.axis("off")
plt.show()
```
### 裁剪图像的应用场景
如果图像来自固定的安全摄像头,我们可以裁剪所有图像,使其只包含感兴趣的区域。
## 4. 模糊图像
### 问题描述
在某些情况下,我们可能需要对图像进行平滑处理,以减少噪声或突出图像的整体特征。
### 解决方案
可以通过将每个像素转换为其邻域像素的平均值来模糊图像。这个邻域和所执行的操作在数学上用核(kernel)来表示。核的大小决定了模糊的程度,较大的核会产生更平滑的图像。以下是代码示例:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 以灰度模式加载图像
image = cv2.imread("images/plane_256x256.jpg", cv2.IMREAD_GRAYSCALE)
# 使用5x5的核模糊图像
image_blurry = cv2.blur(image, (5, 5))
# 显示图像
plt.imshow(image_blurry, cmap="gray")
plt.axis("off")
plt.show()
# 使用100x100的核模糊图像
image_very_blurry = cv2.blur(image, (100, 100))
# 显示图像
plt.imshow(image_very_blurry, cmap="gray")
plt.xticks([])
plt.yticks([])
plt.show()
```
### 核的原理
我们使用的模糊核如下所示:
```python
# 创建核
kernel = np.ones((5, 5)) / 25.0
# 显示核
print(kernel)
```
输出结果:
```
[[0.04 0.04 0.04 0.04 0.04]
[0.04 0.04 0.04 0.04 0.04]
[0.04 0.04 0.04 0.04 0.04]
[0.04 0.04 0.04 0.04 0.04]
[0.04 0.04 0.04 0.04 0.04]]
```
核的中心元素是正在检查的像素,其余元素是其邻域像素。由于所有元素的值都相同(归一化后总和为1),因此每个元素在目标像素的最终值中具有相同的权重。我们也可以使用`filter2D`函数手动应用核来产生类似的模糊效果:
```python
# 应用核
image_kernel = cv2.filter2D(image, -1, kernel)
# 显示图像
plt.imshow(image_kernel, cmap="gray")
plt.xticks([])
plt.yticks([])
plt.show()
```
## 5. 锐化图像
### 问题描述
有时候,我们需要增强图像的边缘和细节,使图像更加清晰。
### 解决方案
可以创建一个突出目标像素的核,然后使用`filter2D`函数将其应用到图像上。以下是代码示例:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 以灰度模式加载图像
image = cv2.imread("images/plane_256x256.jpg", cv2.IMREAD_GRAYSCALE)
# 创建核
kernel = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])
# 锐化图像
image_sharp = cv2.filter2D(image, -1, kernel)
# 显示图像
plt.imshow(image_sharp, cmap="gray")
plt.axis("off")
plt.show()
```
### 锐化的原理
锐化的原理与模糊类似,不同之处在于,锐化使用的核是为了突出像素本身,而不是平均邻域像素的值。这样可以使图像的边缘和对比度更加明显。
## 6. 增强对比度
### 问题描述
我们可能希望增加图像中像素之间的对比度,使图像中的物体和形状更加突出。
### 解决方案
直方图均衡化是一种常用的图像处理工具,可以使图像中的物体和形状更加突出。对于灰度图像,可以直接使用OpenCV的`equalizeHist`函数:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 以灰度模式加载图像
image = cv2.imread("images/plane_256x256.jpg", cv2.IMREAD_GRAYSCALE)
# 增强图像对比度
image_enhanced = cv2.equalizeHist(image)
# 显示图像
plt.imshow(image_enhanced, cmap="gray")
plt.axis("off")
plt.show()
```
对于彩色图像,需要先将图像转换为YUV颜色格式,然后对Y通道(亮度通道)应用直方图均衡化,最后再将图像转换回BGR或RGB格式:
```python
import cv2
import numpy as np
from matplotlib import pyplot as plt
# 加载彩色图像
image_bgr = cv2.imread("images/plane.jpg")
# 将图像转换为YUV格式
image_yuv = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2YUV)
# 对Y通道应用直方图均衡化
image_yuv[:, :, 0] = cv2.equalizeHist(image_yuv[:, :, 0])
# 将图像转换回RGB格式
image_rgb = cv2.cvtColor(image_yuv, cv2.COLOR_YUV2RGB)
# 显示图像
plt.imshow(image_rgb)
plt.axis("off")
plt.show()
```
### 直方图均衡化的原理
直方图均衡化的详细原理超出了本文的范围,但简单来说,它通过变换图像的像素强度,使图像使用更广泛的像素强度范围,从而增强图像的对比度。
### mermaid流程图
```mermaid
graph LR
A[加载图像] --> B{是否为灰度图像}
B -- 是 --> C[应用equalizeHist]
B -- 否 --> D[转换为YUV格式]
D --> E[对Y通道应用equalizeHist]
E --> F[转换回RGB格式]
C --> G[显示图像]
F --> G
```
## 7. 分离颜色
### 问题描述
有时候,我们可能只对图像中的某种颜色感兴趣,需要将其分离出来。
### 解决方案
可以定义一个颜色范围,然后对图像应用掩码(mask)来分离出指定颜色的区域。以下是代码示例:
```pytho
```
0
0
复制全文
相关推荐










