翼度科技»论坛 编程开发 python 查看内容

【scipy 基础】--图像处理

4

主题

4

帖子

12

积分

新手上路

Rank: 1

积分
12
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算法
  1. import matplotlib.pyplot as plt
  2. import cv2
  3. from scipy import ndimage
  4. image = plt.imread("d:/share/python-logo.png")
  5. # 图像灰度化
  6. gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  7. # 使用索贝尔边缘检测算法
  8. name = "sobel"
  9. edges = ndimage.sobel(gray)
  10. # 显示原始图像和边缘检测结果
  11. fig, ax = plt.subplots(1, 3, figsize=(8, 4))
  12. ax[0].imshow(image)
  13. ax[0].set_title("原始图像")
  14. ax[1].imshow(gray, cmap="gray")
  15. ax[1].set_title("灰度图像")
  16. ax[2].imshow(edges, cmap="gray")
  17. ax[2].set_title("边缘检测({}算法)".format(name))
  18. plt.show()
复制代码

2.2. prewitt算法

代码和上面的类似,不同的部分就下面两行。
  1. # 使用prewitt边缘检测算法
  2. name = "prewitt"
  3. edges = ndimage.prewitt(gray)
复制代码

2.3. laplace算法

上面两种算法的效果看上去很类似,laplace算法的结果看上去比上面两种效果更好一些。
  1. name = "laplace"
  2. edges = ndimage.laplace(gray)
复制代码

3. 侵蚀和膨胀

侵蚀和膨胀是最基本的两种图像形态学操作,它们的作用用来增强目标特征。
仍然使用上面的python logo图片,演示侵蚀和膨胀的操作。
  1. import matplotlib.pyplot as plt
  2. import cv2
  3. from scipy import ndimage
  4. image = plt.imread("d:/share/python-logo.png")
  5. # 图像灰度化
  6. image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
  7. # 图像侵蚀
  8. structure = ndimage.generate_binary_structure(2, 2)
  9. erosion = ndimage.binary_erosion(image, structure)
  10. # 图像膨胀
  11. dilation = ndimage.binary_dilation(image, structure)
  12. # 显示原始图像、侵蚀图像和膨胀图像
  13. fig, ax = plt.subplots(1, 3, figsize=(8, 4))
  14. ax[0].imshow(image, cmap="gray")
  15. ax[0].set_title("灰度图像")
  16. ax[1].imshow(erosion, cmap="gray")
  17. ax[1].set_title("图像--侵蚀")
  18. ax[2].imshow(dilation, cmap="gray")
  19. ax[2].set_title("图像--膨胀")
  20. plt.show()
复制代码

简单来说,侵蚀操作会扩张图像中黑色的区域,反之,膨胀操作会扩张图像中白色的区域。
直观上来看的话,侵蚀变了,膨胀变了。
4. 总结

Scipy的图像模块本质上是把图像当作数组来处理,
虽然它不是专门的图像处理库,不过它处理速度很快,且和numpy等库结合紧密,
经常处理图像的朋友可以把它当成一个辅助的工具。

来源:https://www.cnblogs.com/wang_yb/p/17830942.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具