SciPy科学计算与应用:SciPy图像处理入门-掌握scipy.ndimage模块
SciPy图像处理实战:从基础到应用
学习目标
通过本课程,学员将掌握使用SciPy库中的scipy.ndimage
模块进行图像处理的基本方法,包括图像滤波、形态学操作和几何变换。实验将通过理论讲解与实践操作相结合的方式,帮助学员深入理解图像处理的核心概念和技术。
相关知识点
- SciPy图像处理实战
学习内容
1 SciPy图像处理实战
1.1 图像滤波
图像滤波是图像处理中的一项基本技术,用于去除图像中的噪声或增强图像的某些特征。在scipy.ndimage
模块中,提供了多种滤波器,如高斯滤波、中值滤波等,这些滤波器可以帮助改善图像质量或提取图像特征。
1.1.1高斯滤波
高斯滤波是一种常用的平滑滤波器,它通过一个高斯核来对图像进行卷积操作,从而达到平滑图像的效果。高斯滤波可以有效地减少图像中的高频噪声,同时保留图像的主要特征。
%pip install scikit-image
import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage
from skimage import data# 加载示例图像
image = data.camera()# 应用高斯滤波
filtered_image = ndimage.gaussian_filter(image, sigma=1)# 显示原始图像和滤波后的图像
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original Image')
ax[1].imshow(filtered_image, cmap='gray')
ax[1].set_title('Gaussian Filtered Image')
plt.show()
也可以使用本地图片:
import numpy as np
import matplotlib.pyplot as plt
from scipy import ndimage
# 移除了不需要的skimage.data导入# 读取本地图片
image = plt.imread('testIMG.jpg')# 如果图片是彩色的,转换为灰度图
if len(image.shape) == 3:image = np.mean(image, axis=2).astype(np.uint8)# 应用高斯滤波
filtered_image = ndimage.gaussian_filter(image, sigma=1)# 显示原始图像和滤波后的图像
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original Image')
ax[1].imshow(filtered_image, cmap='gray')
ax[1].set_title('Gaussian Filtered Image')
plt.show()
1.1.2 中值滤波
中值滤波是一种非线性滤波器,它通过将每个像素点的值替换为其邻域内的中值来减少噪声。中值滤波对于去除椒盐噪声特别有效。
# 应用中值滤波
median_filtered_image = ndimage.median_filter(image, size=3)# 显示原始图像和滤波后的图像
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original Image')
ax[1].imshow(median_filtered_image, cmap='gray')
ax[1].set_title('Median Filtered Image')
plt.show()
本地图片:
1.2 形态学操作
形态学操作是基于图像形状的处理方法,主要用于提取图像的结构信息。常见的形态学操作包括膨胀、腐蚀、开运算和闭运算。这些操作通常用于二值图像,但也可以应用于灰度图像。
1.2.1 腐蚀
腐蚀操作通过移除对象边界上的像素来减小对象的大小。腐蚀可以用于去除小的噪声点或断开连接的物体。
# 创建一个二值图像
binary_image = image > 128# 应用腐蚀操作
eroded_image = ndimage.binary_erosion(binary_image, structure=np.ones((3, 3)))# 显示原始图像和腐蚀后的图像
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(binary_image, cmap='gray')
ax[0].set_title('Binary Image')
ax[1].imshow(eroded_image, cmap='gray')
ax[1].set_title('Eroded Image')
plt.show()
本地照片:
1.2.2 膨胀
膨胀操作通过在对象边界上添加像素来增大对象的大小。膨胀可以用于填补对象中的小孔或连接断开的物体。
# 应用膨胀操作
dilated_image = ndimage.binary_dilation(binary_image, structure=np.ones((3, 3)))# 显示原始图像和膨胀后的图像
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(binary_image, cmap='gray')
ax[0].set_title('Binary Image')
ax[1].imshow(dilated_image, cmap='gray')
ax[1].set_title('Dilated Image')
plt.show()
本地图片:
1.3 几何变换
几何变换用于改变图像的几何属性,如平移、旋转、缩放等。这些变换在图像对齐、图像配准和图像增强中非常有用。
1.3.1 旋转
旋转操作可以将图像绕着某个点旋转一定的角度。旋转操作通常需要指定旋转中心和旋转角度。
# 应用旋转操作
rotated_image = ndimage.rotate(image, angle=45, reshape=False)# 显示原始图像和旋转后的图像
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original Image')
ax[1].imshow(rotated_image, cmap='gray')
ax[1].set_title('Rotated Image')
plt.show()
本地图片:
1.3.2 缩放
缩放操作可以改变图像的大小。缩放操作通常需要指定缩放因子,可以是放大或缩小。
# 应用缩放操作
scaled_image = ndimage.zoom(image, zoom=0.5)# 显示原始图像和缩放后的图像
fig, ax = plt.subplots(1, 2, figsize=(10, 5))
ax[0].imshow(image, cmap='gray')
ax[0].set_title('Original Image')
ax[1].imshow(scaled_image, cmap='gray')
ax[1].set_title('Scaled Image')
plt.show()
本地图片:
通过本课程的学习,学员将能够熟练使用scipy.ndimage
模块进行图像处理,掌握图像滤波、形态学操作和几何变换的基本方法。