使用python对nXm数组进行排名过滤器

计算科学 Python scipy 麻木的
2021-11-29 19:59:57

我想在 nXm numpy 数组上应用排名过滤器。假设我有这个数组:

a = np.random.randint(100,size=(5,5))

array([[ 9, 71, 55, 72, 43],
       [46, 56, 44, 17, 64],
       [53, 51, 17, 71, 36],
       [12, 28, 97, 46, 35],
       [29, 55, 27, 48,  5]])

我想运行一个等级过滤器(3X3 的内核窗口),它将根据其在直方图中的位置为内核中的每个中心像素提供一个值\等级(从 1-9,因为它是一个 3X3 窗口)。最大的数字将获得值 9,最小的数字将获得值 1。例如,位置 1,1 中的值 56 将获得值 8,因为根据其 8 个邻居,它是第二大数字。位置 1,2 中的值 44 将获得 3 的值,因为它是第三低的数字,只有在它下面的两个值都是 17。(现在让我们忽略边缘问题和并列值问题)。

我发现scipy.stats.rankdata可以达到我想要的结果,但问题是它不是卷积滤波器,这意味着它适用于整个数组而不是根据内核方法,它也提供 1Xm 的输出数组,这意味着它不保留原始的 nXm 数组形状。

所以我认为我需要以某种方式使用这个 scipy.stats.rankdata 过滤器作为我选择的大小的移动内核。

我知道 scipy 有 convolve 方法,例如ndimage.convolve我过去使用的方法,并且该方法用作运行内核窗口。但我不知道如何组合它们以获得“正确的”内核排名过滤器。

我还看到 scipy 有scipy.ndimage.filters.rank_filter但我不明白排名实际上是如何工作的。

0个回答
没有发现任何回复~