📌 目录

  1. 模块简介
  2. 图像滤波
  3. 边缘检测与图像梯度
  4. 图像形态学操作
  5. 图像变换与旋转
  6. 示例:图像滤波与处理应用
  7. 出站链接与参考资料

1. 模块简介

scipy.ndimage 是 SciPy 中用于图像处理的核心模块,提供了各种处理图像的功能,如过滤、变换、边缘检测、形态学操作等。这些操作广泛应用于医学图像处理、计算机视觉、遥感图像分析等领域。

主要功能包括:

  • 图像滤波:模糊、锐化、边缘检测
  • 图像梯度:计算图像的梯度和边缘
  • 形态学操作:膨胀、腐蚀、开闭运算等
  • 几何变换:旋转、缩放、平移、图像坐标变换

2. 图像滤波

高斯滤波

高斯滤波用于去噪和平滑图像,常用于图像预处理。

from scipy.ndimage import gaussian_filter
import numpy as np
import matplotlib.pyplot as plt

# 生成一个简单的二维图像(如正弦波图像)
x = np.linspace(-3.0, 3.0, 100)
y = np.linspace(-3.0, 3.0, 100)
X, Y = np.meshgrid(x, y)
Z = np.exp(-(X**2 + Y**2))

# 应用高斯滤波
Z_filtered = gaussian_filter(Z, sigma=1)

# 可视化原图与滤波后的图像
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
ax[0].imshow(Z, cmap='gray')
ax[0].set_title('原图')
ax[1].imshow(Z_filtered, cmap='gray')
ax[1].set_title('高斯滤波后图像')
plt.show()

中值滤波

中值滤波用于去除椒盐噪声,尤其适用于处理含有孤立噪声的图像。

from scipy.ndimage import median_filter

# 应用中值滤波
Z_median_filtered = median_filter(Z, size=3)

# 可视化滤波结果
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
ax[0].imshow(Z, cmap='gray')
ax[0].set_title('原图')
ax[1].imshow(Z_median_filtered, cmap='gray')
ax[1].set_title('中值滤波后图像')
plt.show()


3. 边缘检测与图像梯度

边缘检测是图像处理中的重要步骤,用于识别图像中的结构、轮廓和边界。

Sobel 边缘检测

from scipy.ndimage import sobel

# 计算图像的梯度(Sobel)
gradient_x = sobel(Z, axis=0)  # x方向的梯度
gradient_y = sobel(Z, axis=1)  # y方向的梯度

# 可视化梯度图像
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
ax[0].imshow(gradient_x, cmap='gray')
ax[0].set_title('X方向梯度')
ax[1].imshow(gradient_y, cmap='gray')
ax[1].set_title('Y方向梯度')
plt.show()

Sobel 算子可用于检测图像的水平和垂直边缘,计算得到的梯度图像反映了图像中边缘的变化。


4. 图像形态学操作

形态学操作用于对图像进行几何结构分析,常用于二值图像中。

膨胀与腐蚀

膨胀操作将图像中的白色区域扩大,腐蚀操作则相反。

from scipy.ndimage import binary_erosion, binary_dilation

# 创建二值图像
binary_image = Z > 0.5

# 膨胀与腐蚀操作
dilated_image = binary_dilation(binary_image)
eroded_image = binary_erosion(binary_image)

# 可视化操作结果
fig, ax = plt.subplots(1, 3, figsize=(18, 6))
ax[0].imshow(binary_image, cmap='gray')
ax[0].set_title('原始二值图像')
ax[1].imshow(dilated_image, cmap='gray')
ax[1].set_title('膨胀后图像')
ax[2].imshow(eroded_image, cmap='gray')
ax[2].set_title('腐蚀后图像')
plt.show()

开运算与闭运算

开运算通常用于去除小的噪声,而闭运算用于填充小的孔洞。

from scipy.ndimage import binary_opening, binary_closing

# 开闭运算
opened_image = binary_opening(binary_image)
closed_image = binary_closing(binary_image)

# 可视化结果
fig, ax = plt.subplots(1, 3, figsize=(18, 6))
ax[0].imshow(binary_image, cmap='gray')
ax[0].set_title('原始二值图像')
ax[1].imshow(opened_image, cmap='gray')
ax[1].set_title('开运算后图像')
ax[2].imshow(closed_image, cmap='gray')
ax[2].set_title('闭运算后图像')
plt.show()


5. 图像变换与旋转

图像旋转与平移

scipy.ndimage 提供了几何变换操作,可以对图像进行旋转、平移等操作。

from scipy.ndimage import rotate, shift

# 图像旋转
rotated_image = rotate(Z, angle=45)

# 图像平移
shifted_image = shift(Z, shift=(5, 5))

# 可视化图像变换结果
fig, ax = plt.subplots(1, 3, figsize=(18, 6))
ax[0].imshow(Z, cmap='gray')
ax[0].set_title('原图')
ax[1].imshow(rotated_image, cmap='gray')
ax[1].set_title('旋转后图像')
ax[2].imshow(shifted_image, cmap='gray')
ax[2].set_title('平移后图像')
plt.show()


6. 示例:图像滤波与处理应用

示例:图像去噪

在图像处理应用中,去噪是常见的需求。通过高斯滤波器,可以有效去除噪声。

from scipy.ndimage import gaussian_filter

# 生成带噪声的图像
noisy_image = Z + 0.1 * np.random.random(Z.shape)

# 应用高斯滤波去噪
denoised_image = gaussian_filter(noisy_image, sigma=2)

# 可视化去噪效果
fig, ax = plt.subplots(1, 2, figsize=(12, 6))
ax[0].imshow(noisy_image, cmap='gray')
ax[0].set_title('带噪声图像')
ax[1].imshow(denoised_image, cmap='gray')
ax[1].set_title('去噪后的图像')
plt.show()


🔗 出站链接与参考资料

📘 官方文档

📚 实用教程与资源