Scipy基础--图像处理

SciPy库本身是针对科学计算而不是图像处理的,只是图像处理也包含了很多数学计算,

所以Scipy也提供了一个专门的模块ndimage用于图像处理。

ndimage模块提供的功能包括输入/输出图像、显示图像、基本操作(如裁剪、翻转、旋转等)、图像过滤(如去噪、锐化等)、图像分割、分类、特征提取以及注册/配准等任务。

这个模块支持多种图像格式的读取和写入,使得对图像的处理变得方便快捷。

1. 主要功能

虽然图像处理不是Scipy的主要目的,Scipy中也提供了70多个各类图像处理函数。

类别 主要函数 说明
过滤器 包含convolve等20多个函数 各类卷积和滤波相关的计算函数
傅立叶滤波器 包含fourier_ellipsoid等4个函数 多维椭球傅里叶,高斯傅里叶等滤波器
图像插值 包含affine_transform等8个函数 图像的反射变换,移动,旋转等相关函数
图像测量 包含center_of_mass等将近20个函数 计算图像几何特征的相关函数
形态学 包含binary_closing等20多个函数 图像的侵蚀,膨胀,二元开闭运算等等

图像处理底层函数专业性较强,下面结合图片演示一些比较直观的例子。

2. 边缘检测

图像边缘检测 在计算机视觉和图像处理中是非常重要的任务之一。
边缘是图像中像素值发生显著变化的地方,它可以提供有关图像的重要信息,例如物体的轮廓、边界等。

ndimage模块中提供了多种算法来检测边缘,下面演示三种不同的边缘检测算法的效果:

(示例中所用的图片是维基百科上找的一个python logo

2.1. sobel算法

python 复制代码
import matplotlib.pyplot as plt
import cv2
from scipy import ndimage

image = plt.imread("d:/share/python-logo.png")
# 图像灰度化
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 使用索贝尔边缘检测算法
name = "sobel"
edges = ndimage.sobel(gray)

# 显示原始图像和边缘检测结果
fig, ax = plt.subplots(1, 3, figsize=(8, 4))
ax[0].imshow(image)
ax[0].set_title("原始图像")
ax[1].imshow(gray, cmap="gray")
ax[1].set_title("灰度图像")
ax[2].imshow(edges, cmap="gray")
ax[2].set_title("边缘检测({}算法)".format(name))
plt.show()

2.2. prewitt算法

代码和上面的类似,不同的部分就下面两行。

python 复制代码
# 使用prewitt边缘检测算法
name = "prewitt"
edges = ndimage.prewitt(gray)

2.3. laplace算法

上面两种算法的效果看上去很类似,laplace算法的结果看上去比上面两种效果更好一些。

python 复制代码
name = "laplace"
edges = ndimage.laplace(gray)

3. 侵蚀和膨胀

侵蚀和膨胀是最基本的两种图像形态学操作,它们的作用用来增强目标特征。

仍然使用上面的python logo图片,演示侵蚀和膨胀的操作。

python 复制代码
import matplotlib.pyplot as plt
import cv2
from scipy import ndimage

image = plt.imread("d:/share/python-logo.png")
# 图像灰度化
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 图像侵蚀
structure = ndimage.generate_binary_structure(2, 2)
erosion = ndimage.binary_erosion(image, structure)

# 图像膨胀
dilation = ndimage.binary_dilation(image, structure)

# 显示原始图像、侵蚀图像和膨胀图像
fig, ax = plt.subplots(1, 3, figsize=(8, 4))
ax[0].imshow(image, cmap="gray")
ax[0].set_title("灰度图像")
ax[1].imshow(erosion, cmap="gray")
ax[1].set_title("图像--侵蚀")
ax[2].imshow(dilation, cmap="gray")
ax[2].set_title("图像--膨胀")
plt.show()

简单来说,侵蚀操作会扩张图像中黑色的区域,反之,膨胀操作会扩张图像中白色的区域。

直观上来看的话,侵蚀变 了,膨胀变了。

4. 总结

Scipy图像模块 本质上是把图像当作数组来处理,

虽然它不是专门的图像处理库,不过它处理速度很快,且和numpy等库结合紧密,

经常处理图像的朋友可以把它当成一个辅助的工具。

相关推荐
Christo38 小时前
TFS-2018《On the convergence of the sparse possibilistic c-means algorithm》
人工智能·算法·机器学习·数据挖掘
用户Taobaoapi201413 小时前
京东店铺所有商品API技术开发文档
大数据·数据挖掘·数据分析
总有刁民想爱朕ha13 小时前
车牌模拟生成器:Python3.8+Opencv代码实现与商业应用前景(C#、python 开发包SDK)
开发语言·python·数据挖掘
Stestack15 小时前
人工智能常见分类
人工智能·分类·数据挖掘
华科云商xiao徐19 小时前
告别IP被封!分布式爬虫的“隐身”与“分身”术
爬虫·数据挖掘·数据分析
未来之窗软件服务1 天前
商业软件开发入门到精通之路-东方仙盟
人工智能·数据挖掘·仙盟创梦ide·东方仙盟·商业软件开发入门
没有梦想的咸鱼185-1037-16631 天前
【高分论文密码】大尺度空间模拟预测与数字制图
信息可视化·数据分析·r语言
民乐团扒谱机1 天前
逻辑回归算法干货详解:从原理到 MATLAB 可视化实现
数学建模·matlab·分类·数据挖掘·回归·逻辑回归·代码分享
计算机毕业设计指导2 天前
基于ResNet50的智能垃圾分类系统
人工智能·分类·数据挖掘
m0_575046342 天前
FPGA数据流分析
数据分析·fpga·数据流分析