📌 目录
scipy.ndimage
模块简介- 图像读取与展示(配合
matplotlib
/imageio
) - 图像滤波:高斯、均值、中值滤波
- 边缘检测与梯度计算
- 图像几何变换:缩放、旋转、平移
- 二值图像处理:腐蚀、膨胀、连通区域标记
- 示例:图像平滑 + 边缘检测综合案例
- 出站链接与参考资料
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()
🔗 出站链接与参考资料
📘 官方文档
- SciPy ndimage 模块:
https://docs.scipy.org/doc/scipy/reference/ndimage.html - 图像滤波函数参考:
https://docs.scipy.org/doc/scipy/reference/ndimage.html#filters
🎓 教程资源
- SciPy Image Processing 教程:
https://scipy-lectures.org/advanced/image_processing/ - Real Python 图像处理案例:
https://realpython.com/image-processing-with-the-python-pillow-library/
发表回复