Mahotas - 处理图像
Mahotas 是一个流行的 Python 包,用于处理图像并对其执行各种操作。它可以对图像执行许多操作,例如将图像分成不同的部分、查找边缘以及识别其中的物体。
使用 Mahotas,我们可以找到一组图片中的所有人脸,或者识别一组图片中不同类型的花朵。我们还可以在 Mahotas 中找到图片中物体的边缘,或者使模糊的图片更清晰。
在本教程中,我们将简要概述如何使用 Mahotas 处理图像,包括如何读取、写入和显示图像。我们还将学习如何执行常见的图像处理任务,例如过滤、分割和特征提取。
使用 Mahotas 进行图像处理
Mahotas 的主要功能之一是它能够处理各种格式的图像,例如 JPEG、PNG 和 BMP。 Mahotas 为我们提供了读取和写入图像以及在不同格式之间转换图像的函数。
让我们学习如何在 Mahotas 中读取图像。
读取图像
在 mahotas 中读取图像是指从文件加载图像数据的过程。要在 Mahotas 中读取图像,我们可以使用 imread() 函数。此函数从文件中读取图像并返回表示该图像的 NumPy 数组。
示例
在下面的代码中,我们尝试读取名为"nature.jpeg"的 JPEG 图像 −
import mahotas as ms image = ms.imread('nature.jpeg') print ("图像已读取。")
输出
这将从文件"nature.jpeg"读取图像并将其存储在变量"image"中 −
图像已读取。
我们还可以像下面讨论的那样在读取图像后显示图像。
显示图像
读取图像后,我们可以使用 matplotlib 库显示它。matplotlib 库用于数据可视化和绘图。
示例
让我们使用 matplotlib 库显示图像"nature.jpeg",如下所示 −
import matplotlib.pyplot as plt import mahotas as ms image = ms.imread('nature.jpeg') plt.imshow(image) plt.show()
输出
以下是执行上述代码时获得的图像−

写入图像
在 Mahotas 中写入图像是指将图像数据保存到特定图像格式(如 PNG、JPEG、BMP、TIFF 等)的文件中。我们可以使用 imsave() 函数在 Mahotas 中写入图像。此函数是 mahotas 中图像输入/输出 (IO) 模块的一部分。
示例
在下面的代码中,我们尝试保存名为"nature.jpeg"的图像 −
import mahotas as ms image = ms.imread('nature.jpeg') print ("图像已读取。") # 将图像写入文件 ms.imsave('writing.jpeg', image) print ("图像数据已保存。")
输出
这会将图像保存到文件"writing.jpeg" −
图像已读取。 图像数据已保存。
使用 Mahotas 进行图像处理
图像处理是指一组用于对图像执行多种操作的技术。这些技术有助于提高图像的视觉质量、提取有用信息或为分析做准备。
一些常见的图像处理任务是过滤、分割和特征提取。在本节中,我们将探讨 Mahotas 提供的一些关键图像处理功能。
过滤
在 mahotas 中,过滤是指修改图像的外观或从中提取有用信息。这是通过对图像应用数学运算来完成的。过滤过程可用于去除噪声、平滑图像、增强边缘或执行其他有助于提高图像质量或可解释性的操作。
示例
在下面的例子中,我们尝试使用高斯滤波器平滑图像。高斯滤波器使图像模糊,可用于降低噪声或平滑图像 −
import mahotas as ms import numpy as np import matplotlib.pyplot as mtplt # 加载图像并将其转换为灰度 image = ms.imread('nature.jpeg', as_grey=True) # 应用高斯滤波器 # 标准偏差 sigma = 15 gaussian_filtered = ms.gaussian_filter(image, sigma) # 显示原始图像 fig, axis = mtplt.subplots(1, 2, figsize=(9, 4)) axes[0].imshow(image, cmap='gray') axes[0].set_title('Original Image') axes[0].axis('off') # 显示过滤后的图像 axes[1].imshow(gaussian_filtered, cmap='gray') axes[1].set_title('Gaussian过滤') axes[1].axis('off') mtplt.show()
输出
这将使用标准偏差为 15 的高斯滤波器平滑原始图像,如下所示 −

分割
Mahotas 中的分割是指根据某些特征或标准将图像划分为有意义的区域或片段的过程。这些片段可以表示不同的对象、感兴趣的区域或图像内的不同区域。
示例
现在,让我们通过 Mahotas 的阈值分割进行图像分割的基本示例。阈值用于根据像素强度值将对象与背景分离。它通过将图像转换为二进制图像来简化图像,其中每个像素被分类为前景(对象)或背景 −
import mahotas as ms import numpy as np import matplotlib.pyplot as mtplt # 加载图像 image = ms.imread('nature.jpeg', as_grey=False) # 执行阈值处理 # 通过取图像平均值计算阈值 threshold = np.mean(image) # 创建二值图像 # 将每个像素值与阈值进行比较 binary_image = image > Threshold # 执行连通分量分析 # 为二值图像中的每个连通区域分配唯一标签 labeled_image, num_objects = ms.label(binary_image) # 显示原始图像 fig, ax = mtplt.subplots(1, 2, figsize=(9, 4)) ax[0].imshow(image, cmap='gray') ax[0].set_title('Original Image') # 显示分割图像 ax[1].imshow(labeled_image, cmap='rainbow') ax[1].set_title('Segmented Image ({} objects)'.format(num_objects)) mtplt.show()
输出
上述代码的输出如下所示 −

特征提取
Mahotas 中的特征提取是指从图像中提取有意义且信息丰富的特征的过程。这些特征可以表示图像的各个方面,例如纹理、形状或颜色,并可用于描述和区分图像中的对象或区域。
示例
现在,让我们看一个如何使用 Mahotas 计算 Zernike 矩的示例。Zernike 矩是一组数值,用于描述图像中对象或区域的形状。它们通过捕捉物体的轮廓和空间特征来提供物体形状的紧凑表示 −
import mahotas as ms from mahotas.features import zernike_moments # 加载图像 image = ms.imread('nature.jpeg', as_grey=True) # 标准化图像 normalized_image = ms.stretch(image) # 指定 Zernike 矩计算的半径 radius = 30 # 计算 Zernike 矩 moments = zernike_moments(normalized_image, radius) # 打印结果矩 print(moments)
输出
执行上述代码后,我们得到一组描述图像形状特征的数值,如下所示 −
[0.31830989 0.01252728 0.00854837 0.00677556 0.00239216 0.00742469 0.00553204 0.00306795 0.01058855 0.00368774 0.00456233 0.01123103 0.00336877 0.00349998 0.00387494 0.0108442 0.00294575 0.00490895 0.00243368 0.01113736 0.00229705 0.00511743 0.00668574 0.0083512 0.00767699]