Mahotas - 等级过滤器
等级过滤器是一种通过根据像素的相对等级(位置)更改像素值来修改图像的技术。它关注的是像素值,而不是它们的实际强度。
对于图像中的每个像素,等级过滤器会检查其邻域内所有像素的值,并按升序或降序排列它们。
然后,它会根据其位置或等级从排序列表中选择一个特定的像素值。
例如,如果将等级过滤器设置为选择中值,它将从排序列表中选择中间像素值。
如果将其设置为选择最小值或最大值,它将分别选择第一个或最后一个值。
Mahotas 中的等级过滤器
我们可以使用 mahotas.rank_filter() 函数在 mahotas 中执行等级过滤器。 mahotas 中的等级过滤器会比较邻域内的像素强度值,并根据其在强度排序列表中的等级为每个像素分配一个新值。
为了详细说明,让我们看看等级过滤器在 mahotas − 中的工作原理
假设您有一张由许多像素组成的灰度图像,每个像素都具有从黑色到白色的特定强度值。
现在,让我们关注图像中的特定像素。等级过滤器将检查此像素周围的邻域。
在此邻域内,等级过滤器将比较所有像素的强度值。它将根据强度值按升序或降序排列这些像素,具体取决于过滤器的配置。
一旦强度值排序,等级过滤器将根据其在有序列表中的等级为中心像素分配一个新值。这个新值通常是邻域内的中位数、最小值或最大值。
通过对图像中的每个像素重复此过程,等级过滤器可以帮助完成各种图像增强任务。
mahotas.rank_filter() 函数
mahotas 中的 rank_filter() 函数接受三个参数:要过滤的图像、结构元素和邻域的大小。
邻域是每个像素周围的矩形区域,其大小由每个维度的像素数指定。例如,大小为 3×3 的邻域将包括像素的八个邻居。
rank_filter() 函数返回与原始图像具有相同尺寸的新图像。新图像中的值是原始图像中相应像素的排名。
语法
以下是 mahotas − 中 rank_filter() 函数的基本语法
mahotas.rank_filter(f, Bc, rank, mode='reflect', cval=0.0, out=None)
其中,
f −它是将应用等级过滤器的输入图像数组。
Bc − 定义每个像素周围邻域的结构元素。
rank − 它确定要从邻域内的排序列表中选择的像素值的等级。如果需要多个等级,等级可以是整数或整数列表。
mode(可选) − 确定如何处理输入图像的边界。它可以采用以下值之一:"ignore"、"constant"、"nearest"、"mirror"或"wrap"。默认值为"reflect"。
cval(可选) − 当 mode='constant' 时要使用的值。默认值为 0.0。
out(可选) − 用于存储排名过滤器输出的数组。如果未提供,则创建一个新数组。
示例
以下是使用 rank_filter() 函数过滤图像的基本示例 −
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt # 创建示例灰度图像 image = mh.imread('nature.jpeg', as_grey = True) # 应用最小过滤器 filtered_image = mh.rank_filter(image, mh.disk(6), rank=0) print(filtered_image) # 显示原始图像 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(filtered_image, cmap='gray') axes[1].set_title('Rank Filtered') axes[1].axis('off') mtplt.show()
输出
之后执行上述代码,我们得到以下输出 −
[[193.71 193.71 193.71 ... 206.17 206.17 207.17] [193.71 193.71 193.71 ... 206.17 206.17 207.17] [193.71 193.71 193.71 ... 206.17 206.17 207.17] ... [ 74.59 62.44 53.62 ... 4.85 4.85 4.85] [ 85.37 74.59 62.44 ... 4.85 4.85 4.85] [ 90.05 79.3 73.18 ... 4.85 4.85 4.85]]
显示的图像如下所示 −

RGB 图像上的 Rank Filter
彩色图像由三个颜色通道组成:红色、绿色和蓝色 (RGB)。通过分别对每个通道应用 Rank 过滤,我们可以增强每个颜色通道特有的功能。
要在 mahotas 中对 RGB 图像应用 Rank 过滤,我们首先通过指定通道值从 RGB 图像中提取通道。
分别使用红色、绿色和蓝色通道的索引 0、1 和 2 来访问通道值。然后,我们在每个通道上应用等级滤波器并将它们堆叠在一起以重建最终的 RGB 图像。
示例
在这里,我们在 RGB 图像的每个通道上分别应用具有不同邻域大小的中值滤波器 −
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt image = mh.imread('nature.jpeg') # 在每个通道上分别应用具有不同邻域大小的中值滤波器 filtered_image = np.stack([mh.rank_filter(image[:, :, 0], mh.disk(2), rank=4), mh.rank_filter(image[:, :, 1], mh.disk(1), rank=4), mh.rank_filter(image[:, :, 2], mh.disk(3), rank=4)], axis=2) # 显示原始图像 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(filtered_image, cmap='gray') axes[1].set_title('Rank Filtered') axes[1].axis('off') mtplt.show()
输出
以下是上述代码的输出 −

使用"Wrap"模式
在对图像执行等级过滤时,边缘或边界处的像素通常缺乏足够的相邻像素来准确计算等级。
为了解决这个问题,Mahotas 中的"wrap"模式将图像值环绕到另一侧。这意味着图像一端的像素值被视为另一端像素的邻居。
这样就创建了从一侧到另一侧的无缝过渡,确保在计算等级值时考虑边界处的像素。
示例
import mahotas as mh import numpy as np import matplotlib.pyplot as mtplt image = mh.imread('sun.png', as_grey = True) # 应用具有"wrap"模式的最大过滤器 filtered_image = mh.rank_filter(image, mh.disk(10), rank=8, mode='wrap') print(filtered_image) # 显示原始图像 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(filtered_image, cmap='gray') axes[1].set_title('Rank Filtered') axes[1].axis('off') mtplt.show()
输出
上述代码的输出如下 −
[[49.92 49.92 49.92 ... 49.92 49.92 49.92] [49.92 49.92 49.92 ... 49.92 49.92 49.92] [49.92 49.92 49.92 ... 49.92 49.92 49.92] ... [49.92 49.92 49.92 ... 49.92 49.92 49.92] [49.92 49.92 49.92 ... 49.92 49.92 49.92] [49.92 49.92 49.92 ... 49.92 49.92 49.92]]
得到的图像如下 −
