📌 目录
- 模块简介
- 图像滤波
- 边缘检测与图像梯度
- 图像形态学操作
- 图像变换与旋转
- 示例:图像滤波与处理应用
- 出站链接与参考资料
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()
🔗 出站链接与参考资料
📘 官方文档
scipy.ndimage
官方手册:
https://docs.scipy.org/doc/scipy/reference/ndimage.html
发表回复