SciPy - N维图像



SciPy 的 ndimage 子模块专门用于图像处理。这里,ndimage 指的是 n 维图像。

图像处理中最常见的一些任务如下:

  • 输入/输出,显示图像
  • 基本操作 - 裁剪、翻转、旋转等。
  • 图像滤波 - 降噪、锐化等。
  • 图像分割 - 标记对应于不同对象的像素
  • 分类
  • 特征提取
  • 配准

让我们讨论如何使用 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()

上述程序将生成以下输出。

Opening and Writing to Image Files

任何原始格式的图像都是矩阵格式中数字表示的颜色组合。机器只根据这些数字来理解和操作图像。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()

上述程序将生成以下输出。

Cropping Operation Image Files

我们还可以执行一些基本操作,例如将图像上下翻转,如下所述。

# 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()

上述程序将生成以下输出。

Image Turning Operation

除此之外,我们还有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()

上述程序将生成以下输出。

Image Rotation Operation

滤波器

让我们讨论滤波器如何帮助图像处理。

什么是图像处理中的滤波?

滤波是一种修改或增强图像的技术。例如,您可以过滤图像以强调某些特征或去除其他特征。使用滤波实现的图像处理操作包括平滑、锐化和边缘增强。

滤波是一种邻域操作,其中输出图像中任何给定像素的值是通过对相应输入像素邻域中的像素值应用某种算法来确定的。现在让我们使用 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()

上述程序将生成以下输出。

Image Blurring Operation

sigma 值表示模糊级别,范围为五。我们可以通过调整 sigma 值来查看图像质量的变化。有关模糊的更多详细信息,请点击 → 数字图像处理 (DIP) 教程。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

边缘检测

让我们讨论边缘检测如何帮助图像处理。

什么是边缘检测?

边缘检测是一种图像处理技术,用于查找图像中物体的边界。它通过检测亮度的不连续性来工作。边缘检测用于图像分割和数据提取,应用领域包括图像处理、计算机视觉和机器视觉。

最常用的边缘检测算法包括:

  • Sobel
  • Canny
  • Prewitt
  • Roberts
  • 模糊逻辑方法

让我们考虑以下示例。

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()

上述程序将生成以下输出。

Edge Detection

图像看起来像一个色块。现在,我们将检测这些色块的边缘。这里,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()

上述程序将生成以下输出。

Edge Detection-2
广告