欢迎这位怪蜀黍来到《Python机器学习(六十一)SciPy 图像处理 - 大码王 - 博客园》

关闭页面特效

 


图像处理和分析通常被看作是对二维值数组的操作。然而,在一些领域中,必须对高维数的图像进行处理分析,例如,医学成像和生物成像。由于对多维特性的良好支持,numpy非常适合这种类型的应用程序。scipy.ndimage包提供了许多通用的图像处理和分析功能,这些功能支持操作任意维度的数组。

scipy.ndimage中提供了图像矩阵变换、图像滤波、图像卷积等功能。

旋转图片

旋转图片,可以使用ndimage.rotate函数。

测试图片下载: face.png

示例

加载原图片

复制代码
from scipy import ndimage
import matplotlib.image as mpimg
import matplotlib.pyplot as plt

# 加载图片
face = mpimg.imread('./face.png')

# 显示图片
plt.imshow(face)
# plt.savefig('./img2-1.png') # 保存要显示的图片
plt.show()
复制代码

输出

scipy.ndimage pic1

示例

复制代码
from scipy import ndimage
import matplotlib.image as mpimg
import matplotlib.pyplot as plt

# 加载图片
face = mpimg.imread('./face.png')

# 旋转图片
rotate_face = ndimage.rotate(face, 45)

plt.imshow(rotate_face)
# plt.savefig('./img3-1.png') # 保存要显示的图片
plt.show()
复制代码

输出

scipy.ndimage pic2

图像滤波

图像滤波是一种修改/增强图像的技术。例如,可以图像滤波突出图像的某些特性,弱化或删除图像的另一些特性。滤波有很多种,例如:平滑、锐化、边缘增强等等。

示例

对图像进行高斯滤波。高斯滤波是一种模糊滤波,广泛用于滤除图像噪声。

复制代码
from scipy import ndimage
import matplotlib.image as mpimg
import matplotlib.pyplot as plt

# 加载图片
face = mpimg.imread('./face.png')

# 处理图片
face1 = ndimage.gaussian_filter(face, sigma=3)

# 显示图片
plt.imshow(face1)
# plt.savefig('./img4-1.png') # 保存要显示的图片
plt.show()
复制代码

输出

scipy.ndimage pic3

sigma=3表示模糊程度为3,我们可以通过调整sigma值,来比较图像质量的变化。

边缘检测

边缘检测是一种寻找图像中物体边界的图像处理技术。它的原理是通过检测图像中的亮度突变,来识别物体边缘。边缘检测在图像处理、计算机视觉、机器视觉等领域中广泛应用。

常用边缘检测算法包括:

  • Sobel
  • Canny
  • Prewitt
  • Roberts
  • Fuzzy Logic methods

让我们考虑下面的例子。

复制代码
import scipy.ndimage as nd
import numpy as np

im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im[90:-90,90:-90] = 2
im = nd.gaussian_filter(im, 8)

import matplotlib.pyplot as plt
plt.imshow(im)
# plt.savefig('./img5-1.png') # 保存要显示的图片
plt.show()
复制代码

上面的程序将生成以下输出。

scipy.ndimage pic5

图像看起来像一个正方形的色块,我们将检测这些彩色块的边缘。这里使用ndimage的Sobel函数来检测图像边缘,该函数会对图像数组的每个轴分开操作,产生两个矩阵,然后我们使用NumPy中的Hypot函数将这两个矩阵合并为一个矩阵,得到最后结果。

示例

复制代码
import scipy.ndimage as nd
import numpy as np
import matplotlib.pyplot as plt

im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im[90:-90,90:-90] = 2
im = nd.gaussian_filter(im, 8)

sx = nd.sobel(im, axis = 0, mode = 'constant')
sy = nd.sobel(im, axis = 1, mode = 'constant')
sob = np.hypot(sx, sy)

plt.imshow(sob)
# plt.savefig('./img6-1.png') # 保存要显示的图片
plt.show()
复制代码

上面的程序将生成以下输出。

scipy.ndimage pic6

 posted on   大码王  阅读(862)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具

成都

复制代码

喜欢请打赏

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示

目录导航