📜  SciPy-Ndimage

📅  最后修改于: 2020-11-05 04:34:08             🧑  作者: Mango


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

上面的程序将生成以下输出。

打开和写入图像文件

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

上面的程序将生成以下输出。

图像模糊操作

sigma值表示5级模糊程度。通过调整sigma值,我们可以看到图像质量的变化。有关模糊的更多详细信息,请单击→DIP(数字图像处理)教程。

边缘检测

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

什么是边缘检测?

边缘检测是一种图像处理技术,用于查找图像内对象的边界。它通过检测亮度不连续来工作。边缘检测用于图像处理,计算机视觉和机器视觉等领域的图像分割和数据提取。

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

  • 索贝尔
  • 坎尼
  • 普威特
  • 罗伯茨
  • 模糊逻辑方法

让我们考虑以下示例。

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

上面的程序将生成以下输出。

边缘检测2