📌 目录

  1. scipy.ndimage 模块简介
  2. 图像读取与展示(配合 matplotlib / imageio
  3. 图像滤波:高斯、均值、中值滤波
  4. 边缘检测与梯度计算
  5. 图像几何变换:缩放、旋转、平移
  6. 二值图像处理:腐蚀、膨胀、连通区域标记
  7. 示例:图像平滑 + 边缘检测综合案例
  8. 出站链接与参考资料

1. 模块简介:scipy.ndimage

scipy.ndimage 模块提供对多维图像(如二维灰度图、三维 CT 扫描图像)进行数值操作的函数,涵盖:

  • 空间滤波(平滑、锐化)
  • 图像变换(旋转、平移、缩放)
  • 图像形态学(腐蚀、膨胀)
  • 边缘检测与梯度运算
  • 图像测量(连通区域、质心等)

2. 图像读取与展示

import imageio
import matplotlib.pyplot as plt

img = imageio.imread('example.png', pilmode='L')  # 灰度图
plt.imshow(img, cmap='gray')
plt.title("原始图像")
plt.axis('off')
plt.show()


3. 图像滤波

高斯滤波

from scipy.ndimage import gaussian_filter

blurred = gaussian_filter(img, sigma=2)
plt.imshow(blurred, cmap='gray')
plt.title("高斯滤波")
plt.axis('off')
plt.show()

均值滤波(卷积)

from scipy.ndimage import uniform_filter

smoothed = uniform_filter(img, size=5)

中值滤波(去除椒盐噪声)

from scipy.ndimage import median_filter

denoised = median_filter(img, size=3)


4. 边缘检测与梯度

Sobel 梯度边缘检测

from scipy.ndimage import sobel

sx = sobel(img, axis=0)
sy = sobel(img, axis=1)
edge = (sx**2 + sy**2)**0.5

plt.imshow(edge, cmap='gray')
plt.title("Sobel 边缘检测")
plt.axis('off')
plt.show()

Laplace 边缘增强

from scipy.ndimage import laplace

edges = laplace(img)


5. 图像几何变换

旋转

from scipy.ndimage import rotate

rotated = rotate(img, angle=45, reshape=True)

缩放(放大/缩小)

from scipy.ndimage import zoom

zoomed = zoom(img, zoom=1.5)

平移

from scipy.ndimage import shift

shifted = shift(img, shift=[20, 30])  # 垂直 20px,水平 30px


6. 二值图像处理与连通区域

二值腐蚀与膨胀

from scipy.ndimage import binary_erosion, binary_dilation
import numpy as np

binary = img > 128  # 转换为二值图
eroded = binary_erosion(binary)
dilated = binary_dilation(binary)

连通区域标记与质心提取

from scipy.ndimage import label, center_of_mass

labeled, n = label(binary)
centroids = center_of_mass(binary, labeled, range(1, n+1))
print("连通区域数:", n)
print("质心坐标:", centroids)


7. 示例:图像平滑 + 边缘检测

img = imageio.imread('example.png', pilmode='L')
blurred = gaussian_filter(img, sigma=2)
edges = sobel(blurred, axis=0)**2 + sobel(blurred, axis=1)**2

plt.subplot(1, 3, 1)
plt.imshow(img, cmap='gray')
plt.title("原始")

plt.subplot(1, 3, 2)
plt.imshow(blurred, cmap='gray')
plt.title("平滑")

plt.subplot(1, 3, 3)
plt.imshow(edges, cmap='gray')
plt.title("边缘")
plt.tight_layout()
plt.show()


🔗 出站链接与参考资料

📘 官方文档

🎓 教程资源