SciPy ndimage子模块专用于图像处理.在这里,ndimage意味着一个n维图像.
图像处理中一些最常见的任务如下:
输入/输出,显示图像
基本操作 : 去;裁剪,翻转,旋转等.
图像过滤 : 去噪,锐化等.
图像分割 : 标记与不同对象对应的像素
分类
特征提取
注册
让我们讨论如何使用SciPy实现其中一些.
打开和写入图像文件
SciPy中的 misc包带有一些图像.我们使用这些图像来学习图像处理.让我们考虑以下示例.
from scipy import miscf = misc.face()misc.imsave('face.png', f) # uses the Image module (PIL)import matplotlib.pyplot as pltplt.imshow(f)plt.show()
上述程序将生成以下输出.
原始格式的任何图像都是由矩阵格式中的数字表示的颜色组合.机器仅基于这些数字理解和操纵图像. RGB是一种流行的表现方式.
让我们看看上面图像的统计信息.
from scipy import miscface = misc.face(gray = False)print face.mean(), face.max(), face.min()
上述程序将生成以下输出.
110.16274388631184,255,0
现在,我们知道图像是由数字组成的,因此数字值的任何变化都会改变原始图像.让我们对图像进行一些几何变换.基本几何操作是裁剪
from scipy import miscface = misc.face(gray = True)lx, ly = face.shape# Croppingcrop_face = face[lx / 4: - lx / 4, ly / 4: - ly / 4]import matplotlib.pyplot as pltplt.imshow(crop_face)plt.show()
上述程序将生成以下输出.
我们还可以执行一些基本操作,例如将图像颠倒如下所述.
# up <-> down flipfrom scipy import miscface = misc.face()flip_ud_face = np.flipud(face)import matplotlib.pyplot as pltplt.imshow(flip_ud_face)plt.show()
上述程序将生成以下输出.
除此之外,我们还有 rotate()函数,它以指定的角度旋转图像.
# rotationfrom scipy import misc,ndimageface = misc.face()rotate_face = ndimage.rotate(face, 45)import matplotlib.pyplot as pltplt.imshow(rotate_face)plt.show()
上述程序将生成以下输出.
过滤器
让我们讨论过滤器如何帮助图像处理g.
图像处理中的过滤是什么?
过滤是一种修改或增强图像的技术.例如,您可以过滤图像以强调某些功能或删除其他功能.通过滤波实现的图像处理操作包括平滑,锐化和边缘增强.
滤波是一种邻域操作,其中输出图像中任何给定像素的值通过应用某种算法来确定到相应输入像素附近的像素值.现在让我们使用SciPy ndimage执行一些操作.
模糊
模糊被广泛用于降低图像中的噪点.我们可以执行过滤操作并查看图像中的变化.让我们考虑以下示例.
from scipy import miscface = misc.face()blurred_face = ndimage.gaussian_filter(face, sigma=3)import matplotlib.pyplot as pltplt.imshow(blurred_face)plt.show()
上述程序将生成以下输出.
sigma值表示5级的模糊程度.我们可以通过调整sigma值来查看图像质量的变化.有关模糊的更多详细信息,请单击 → DIP(数字图像处理)教程.
边缘检测
让我们讨论边缘检测如何帮助图像处理.
什么是边缘检测?
边缘检测是一种图像处理技术,用于查找图像中对象的边界.它的工作原理是检测亮度的不连续性.边缘检测用于图像处理,计算机视觉和机器视觉等领域的图像分割和数据提取.
最常用的边缘检测算法包括
Sobel
Canny
Prewitt
Roberts
模糊逻辑方法
让我们考虑以下示例.
import scipy.ndimage as ndimport numpy as npim = np.zeros((256, 256))im[64:-64, 64:-64] = 1im[90:-90,90:-90] = 2im = ndimage.gaussian_filter(im, 8)import matplotlib.pyplot as pltplt.imshow(im)plt.show()
以上程序将生成以下输出.
图像看起来像一块方块的颜色.现在,我们将检测那些彩色块的边缘.这里,ndimage提供了一个名为 Sobel 的函数来执行此操作.然而,NumPy提供 Hypot 函数将两个结果矩阵合并为一个.
让我们考虑以下示例.
import scipy.ndimage as ndimport matplotlib.pyplot as pltim = np.zeros((256, 256))im[64:-64, 64:-64] = 1im[90:-90,90:-90] = 2im = ndimage.gaussian_filter(im, 8)sx = ndimage.sobel(im, axis = 0, mode = 'constant')sy = ndimage.sobel(im, axis = 1, mode = 'constant')sob = np.hypot(sx, sy)plt.imshow(sob)plt.show()
上述程序将生成以下输出.