如何制作nxn过滤器以在图像阵列中执行自定义操作?

2024-10-03 00:26:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理各种图像,我想实现一种方法,但我不知道从哪里开始。因此,我期待着一些建议

作为一种方法,我的想法是拍摄一个图像阵列,在选择一个感兴趣的区域后,我们说selectedROI是10x10像素区域作为一个阵列。然后,我如何制作一个大小为2x5的过滤器,以及在制作2x5过滤器之后,如何在选定的区域内移动过滤器,并比较每个2x5过滤器的最小值、最大值和最大值;平均值

我已经成功地实现了选择ROI并将selecedROI打印为阵列。 简单地说,我想做的就是选择一组像素,并在整个selectedROI中将这组像素与另一组像素进行比较。这怎么可能


Tags: 方法图像区域过滤器像素建议中将感兴趣
1条回答
网友
1楼 · 发布于 2024-10-03 00:26:06

听起来像是有一个形状为(10,10)的像素阵列,并希望在阵列上滑动一个形状为(2,5)的窗口,在每个位置执行操作

NumPy的操作有助于实现这一点(请参见此处: https://numpy.org/devdocs/reference/generated/numpy.lib.stride_tricks.sliding_window_view.html),但是文档说滑动窗口视图是通用的,因此对您的情况来说不是最佳的。他们建议改为使用scipy.ndimage操作,我在下面展示了一些示例https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.ndimage.generic_filter.html

首先,我导入了包,并定义了10x10阵列和2x5过滤器大小

>>> import numpy as np
>>> from scipy.ndimage import generic_filter
>>> selectedROI = np.array(range(100)).reshape((10, 10))
>>> selectedROI
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14, 15, 16, 17, 18, 19],
       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
       [50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
       [80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
       [90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])
>>> filter_size = (2, 5)

任何函数都可以使用通用_过滤器(此处使用的是np.average)以滑动窗口方式应用。选择变量a、b、c、d是因为泛型_过滤器为输入数组中的所有位置生成值,包括窗口不完全位于输入数组中的位置。有关切片中“或无”的解释,请参见此处: numpy negative indexing a[:-0]

>>> a = filter_size[0]//2
>>> b = (1 - filter_size[0]%2) - (filter_size[0]//2)
>>> c = filter_size[1]//2
>>> d = (1 - filter_size[1]%2) - (filter_size[1]//2)
>>> generic_filter(selectedROI, np.average, filter_size)[a:b or None, c:d or None]
array([[ 7,  8,  9, 10, 11, 12],
       [17, 18, 19, 20, 21, 22],
       [27, 28, 29, 30, 31, 32],
       [37, 38, 39, 40, 41, 42],
       [47, 48, 49, 50, 51, 52],
       [57, 58, 59, 60, 61, 62],
       [67, 68, 69, 70, 71, 72],
       [77, 78, 79, 80, 81, 82],
       [87, 88, 89, 90, 91, 92]])

您可以在您的用例中使用其他函数,例如np.min和np.max,或者编写您自己的自定义函数,如下所示:How do I use scipy.ndimage.filters.gereric_filter?

>>> generic_filter(selectedROI, np.min, filter_size)[a:b or None, c:d or None]
array([[ 0,  1,  2,  3,  4,  5],
       [10, 11, 12, 13, 14, 15],
       [20, 21, 22, 23, 24, 25],
       [30, 31, 32, 33, 34, 35],
       [40, 41, 42, 43, 44, 45],
       [50, 51, 52, 53, 54, 55],
       [60, 61, 62, 63, 64, 65],
       [70, 71, 72, 73, 74, 75],
       [80, 81, 82, 83, 84, 85]])
>>> generic_filter(selectedROI, np.max, filter_size)[a:b or None, c:d or None]
array([[14, 15, 16, 17, 18, 19],
       [24, 25, 26, 27, 28, 29],
       [34, 35, 36, 37, 38, 39],
       [44, 45, 46, 47, 48, 49],
       [54, 55, 56, 57, 58, 59],
       [64, 65, 66, 67, 68, 69],
       [74, 75, 76, 77, 78, 79],
       [84, 85, 86, 87, 88, 89],
       [94, 95, 96, 97, 98, 99]])

为了清晰起见,这些示例使用2D阵列,但操作应扩展到3D像素阵列

相关问题 更多 >