Mahotas - 裁剪图像
裁剪图像是指从图像中选择和提取感兴趣的特定区域并丢弃其余部分。它使我们能够专注于图像中的特定区域或对象,同时删除不相关或不需要的部分。
通常,要裁剪图像,您需要定义要保留的区域的坐标或尺寸。
在 Mahotas 中裁剪图像
要使用 Mahotas 裁剪图像,我们可以使用 NumPy 数组切片操作来选择图像的所需区域。我们需要定义所需 ROI 的坐标或尺寸。这可以通过指定要裁剪的区域的起点、宽度和高度来完成。
通过提取和隔离 ROI,我们可以分析、操作或仅显示图像的相关部分。
示例
在下面的示例中,我们将图像裁剪为所需的大小 −
import mahotas as mh import numpy as np import matplotlib.pyplot as plt image = mh.imread('sun.png') cropping= image[50:1250,40:340] # 创建带有子图的图形 fig, axis = plt.subplots(1, 2, figsize=(10, 5)) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].axis('off') # 显示裁剪后的图像 axes[1].imshow(cropping, cmap='gray') axes[1].set_title('Cropped Image') axes[1].axis('off') # 调整布局并显示图 plt.tight_layout() plt.show()
输出
以下是上述代码的输出 −

裁剪方形区域
要在 mahotas 中裁剪方形区域,我们需要确定起始和结束行和列。以下是计算这些值的方法 −
步骤 1 − 找到图像的最小尺寸。
步骤 2 − 通过从总行数中减去最小尺寸并将结果除以 2 来计算起始行。
步骤 3 − 通过将起始行添加到最小尺寸来计算结束行。
步骤 4 −使用类似方法计算起始列。
步骤 5 − 通过将起始列添加到最小维度来计算结束列。
使用计算出的起始和结束行和列,我们可以从图像中裁剪出正方形区域。我们通过使用适当的行和列范围对图像数组进行索引来实现这一点。
示例
在这里,我们尝试在正方形区域中裁剪图像 −
import mahotas as mh import numpy as np import matplotlib.pyplot as plt image = mh.imread('tree.tiff') # 获取最小维度 size = min(image.shape[:2]) # 计算图像中心 center = tuple(map(lambda x: x // 2, image.shape[:2])) # 裁剪中心周围的方形区域 crop = image[center[0] - size // 2:center[0] + size // 2, center[1] - size // 2:center[1] + size // 2] # 创建带有子图的图形 fig, axis = plt.subplots(1, 2, figsize=(10, 5)) # 显示原始图像图像 axes[0].imshow(图像) axes[0].set_title('原始图像') axes[0].axis('off') # 显示裁剪后的图像 axes[1].imshow(crop, cmap='gray') axes[1].set_title('裁剪后的图像') axes[1].axis('off') # 调整布局并显示图表 plt.tight_layout() plt.show()
输出
执行上述代码后,我们得到以下输出 −

裁剪圆形区域
要在 mahotas 中将图像裁剪为圆形区域,我们需要确定圆的中心坐标和半径。
我们可以通过将中心计算为图像尺寸的中点并将半径设置为最小尺寸的一半来实现这一点。
接下来,我们创建一个与图像尺寸相同的布尔掩码,其中 True 值表示圆形区域内的像素。
我们通过计算每个像素与中心的距离并将落在指定半径内的像素设置为 True 来实现这一点。
现在我们有了圆形蒙版,我们可以通过将圆形区域外的值设置为零来将其应用于图像。最后,我们得到裁剪后的图像。
示例
现在,我们尝试在圆形区域内裁剪图像 −
import mahotas as mh import numpy as np import matplotlib.pyplot as plt image = mh.imread('sun.png') # 计算图像中心 center = tuple(map(lambda x: x // 2, image.shape[:2])) # 将半径计算为最小尺寸的一半 radius = min(image.shape[:2]) // 2 # 创建零的布尔掩码 mask = np.zeros(image.shape[:2], dtype=bool) # 创建网格索引 y, x = np.ogrid[:image.shape[0], :image.shape[1]] # 将圆形区域内的掩码值设置为 True mask[(x - center[0])**2 + (y - center[1])**2 <= radius**2] = True crop = image.copy() # 将圆形区域外的数值设置为零 crop[~mask] = 0 # 创建带有子图的图形 fig, axis = plt.subplots(1, 2, figsize=(7, 5)) # 显示原始图像 axes[0].imshow(image) axes[0].set_title('Original Image') axes[0].axis('off') # 显示裁剪后的图像 axes[1].imshow(crop, cmap='gray') axes[1].set_title('Cropped Image') axes[1].axis('off') # 调整布局并显示图 plt.tight_layout() plt.show()
输出
得到的输出如下所示 −
