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
# Creating a sample grayscale image
image = mh.imread('nature.jpeg', as_grey = True)
# Applying minimum filter
filtered_image = mh.rank_filter(image, mh.disk(6), rank=0)
print(filtered_image)
# Displaying the original image
fig, axes = mtplt.subplots(1, 2, figsize=(9, 4))
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].axis('off')
# Displaying the rank filtered featured image
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]]

显示的图像如下所示:

Rank Filter

RGB 图像上的排序滤波器

彩色图像由三个颜色通道组成:红色、绿色和蓝色(RGB)。通过分别对每个通道应用排序滤波器,我们可以增强每个颜色通道的特定特征。

要在 mahotas 中对 RGB 图像应用排序滤波器,我们首先通过指定通道值从 RGB 图像中提取通道。

通道值分别使用索引 0、1 和 2 来访问红色、绿色和蓝色通道。然后,我们对每个通道应用排序滤波器,并将它们堆叠在一起以重建最终的 RGB 图像。

示例

在这里,我们分别对 RGB 图像的每个通道应用具有不同邻域大小的中值滤波器:

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
image = mh.imread('nature.jpeg')
# Applying a median filter with different neighborhood sizes on each channel
separately
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)
# Displaying the original image
fig, axes = mtplt.subplots(1, 2, figsize=(9, 4))
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].axis('off')
# Displaying the rank filtered featured image
axes[1].imshow(filtered_image, cmap='gray')
axes[1].set_title('Rank Filtered')
axes[1].axis('off')
mtplt.show()

输出

以下是上述代码的输出:

Rank Filter RGB Image

使用“Wrap”模式

在对图像执行排序滤波时,边缘或边界处的像素通常缺乏足够的相邻像素来准确计算排名。

为了解决此问题,Mahotas 中的“wrap”模式将图像值环绕到另一侧。这意味着图像一端像素的值被视为另一端像素的邻居。

这在两侧之间创建了一个无缝过渡,确保在计算排名值时考虑边界处的像素。

示例

import mahotas as mh
import numpy as np
import matplotlib.pyplot as mtplt
image = mh.imread('sun.png', as_grey = True)
# Applying maximum filter with 'wrap' mode
filtered_image = mh.rank_filter(image, mh.disk(10), rank=8, mode='wrap')
print(filtered_image)
# Displaying the original image
fig, axes = mtplt.subplots(1, 2, figsize=(9, 4))
axes[0].imshow(image, cmap='gray')
axes[0].set_title('Original Image')
axes[0].axis('off')
# Displaying the rank filtered featured image
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]]

获得的图像如下所示:

Wrap Mode
广告