Ndimage(Ndimage)
SciPy ndimage子模块专用于图像处理。 这里,ndimage意味着n维图像。
图像处理中一些最常见的任务如下&miuns;
- 输入/输出,显示图像
- 基本操作 - 裁剪,翻转,旋转等
- 图像过滤 - 去噪,锐化等
- 图像分割 - 标记与不同对象相对应的像素
- Classification
- Feature extraction
- Registration
让我们讨论如何使用SciPy实现其中一些。
打开和写入图像文件
SciPy中的misc package带有一些图像。 我们使用这些图像来学习图像处理。 让我们考虑以下示例。
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() function ,它以指定的角度旋转图像。
# 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()
上述程序将生成以下输出。
过滤器 (Filters)
让我们讨论过滤器如何帮助图像处理。
什么是图像处理中的过滤?
过滤是一种用于修改或增强图像的技术。 例如,您可以过滤图像以强调某些功能或删除其他功能。 通过过滤实现的图像处理操作包括平滑,锐化和边缘增强。
滤波是邻域操作,其中通过将一些算法应用于相应输入像素的邻域中的像素的值来确定输出图像中的任何给定像素的值。 现在让我们使用SciPy ndimage执行一些操作。
Blurring
模糊被广泛用于降低图像中的噪声。 我们可以执行过滤操作并查看图像中的变化。 让我们考虑以下示例。
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()
上述程序将生成以下输出。
西格玛值表示五个等级的模糊程度。 我们可以通过调整sigma值来查看图像质量的变化。 有关模糊的更多详细信息,请单击→DIP(数字图像处理)教程。
边缘检测
让我们讨论边缘检测如何帮助图像处理。
什么是边缘检测?
边缘检测是一种用于查找图像内对象边界的图像处理技术。 它的工作原理是检测亮度的不连续性。 边缘检测用于图像处理,计算机视觉和机器视觉等领域的图像分割和数据提取。
最常用的边缘检测算法包括
- 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 = 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()
上述程序将生成以下输出。