SciPy Ndimage
SciPy ndimage子模块专门用于图像处理。这里,ndimage指的是一个n维的图像。
图像处理中最常见的一些任务如下 &miuns
- 输入/输出,显示图像
- 基本操作–裁剪、翻转、旋转等。
- 图像过滤–去噪、锐化等。
- 图像分割–给对应于不同物体的像素贴上标签
- 分类
- 特征提取
- Registration
让我们来讨论一下如何使用SciPy来实现其中的一些功能。
打开和写入图像文件
SciPy的 misc包里 有一些图像。我们使用这些图像来学习图像操作。让我们来看看下面的例子。
from scipy import misc
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)
import matplotlib.pyplot as plt
plt.imshow(f)
plt.show()
上述程序将产生以下输出。
任何图像在其原始格式中都是由矩阵格式中的数字所代表的颜色组合。机器只根据这些数字来理解和操作图像。RGB是一种流行的表示方法。
让我们看看上述图像的统计信息。
from scipy import misc
face = misc.face(gray = False)
print face.mean(), face.max(), face.min()
上述程序将产生以下输出。
110.16274388631184, 255, 0
现在,我们知道图像是由数字组成的,所以数字值的任何变化都会改变原始图像。让我们对图像进行一些几何变换。基本的几何操作是剪裁
from scipy import misc
face = misc.face(gray = True)
lx, ly = face.shape
# Cropping
crop_face = face[lx / 4: - lx / 4, ly / 4: - ly / 4]
import matplotlib.pyplot as plt
plt.imshow(crop_face)
plt.show()
上述程序将产生以下输出。
我们还可以进行一些基本操作,如将图像倒过来,如下所述。
# up <-> down flip
from scipy import misc
face = misc.face()
flip_ud_face = np.flipud(face)
import matplotlib.pyplot as plt
plt.imshow(flip_ud_face)
plt.show()
上述程序将产生以下输出。
除此之外,我们还有 rotate()函数 ,它可以将图像旋转一个指定的角度。
# rotation
from scipy import misc,ndimage
face = misc.face()
rotate_face = ndimage.rotate(face, 45)
import matplotlib.pyplot as plt
plt.imshow(rotate_face)
plt.show()
上述程序将产生以下输出。
过滤器
让我们讨论一下过滤器是如何帮助图像处理的。
什么是图像处理中的滤波?
滤波是一种修改或增强图像的技术。例如,你可以对图像进行过滤,以强调某些特征或去除其他特征。用滤波实现的图像处理操作包括平滑、锐化和边缘增强。
滤波是一种邻域操作,在这种操作中,输出图像中任何给定像素的值都是通过对相应输入像素的邻域内的像素值应用某种算法而确定的。现在让我们用SciPy ndimage进行一些操作。
模糊化
模糊被广泛用于减少图像中的噪音。我们可以进行过滤操作,看到图像的变化。让我们考虑下面的例子。
from scipy import misc
face = misc.face()
blurred_face = ndimage.gaussian_filter(face, sigma=3)
import matplotlib.pyplot as plt
plt.imshow(blurred_face)
plt.show()
上述程序将产生以下输出。
西格玛值表示模糊的程度,以5为单位。我们可以看到通过调整西格玛值对图像质量的改变。关于模糊处理的更多细节,请点击→DIP(数字图像处理)教程。
边缘检测
让我们讨论一下边缘检测是如何帮助图像处理的。
什么是边缘检测?
边缘检测是一种图像处理技术,用于寻找图像中物体的边界。它通过检测亮度的不连续来工作。边缘检测在图像处理、计算机视觉和机器视觉等领域被用于图像分割和数据提取。
最常用的边缘检测算法包括
- Sobel
- Canny
- Prewitt
- Roberts
- Fuzzy Logic方法
让我们考虑以下例子。
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 = ndimage.gaussian_filter(im, 8)
import matplotlib.pyplot as plt
plt.imshow(im)
plt.show()
上述程序将产生以下输出。
该图像看起来像一个正方形的色块。现在,我们将检测这些色块的边缘。这里,ndimage提供了一个叫做 Sobel 的函数来进行这个操作。而NumPy则提供了 Hypot 函数,将两个结果矩阵合并为一个。
让我们考虑下面的例子。
import scipy.ndimage as nd
import matplotlib.pyplot as plt
im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im[90:-90,90:-90] = 2
im = 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()
上述程序将产生以下输出。