Numpy:获取与蒙版大小相同的矩形区域

k2fxgqgv  于 2022-11-24  发布在  其他
关注(0)|答案(3)|浏览(142)

**我有一个图像和一个遮罩。两者都是numpy数组。**我通过GraphSegmentation(cv2.ximgproc.segmentation)得到遮罩,所以区域不是矩形,但没有被分割。我想得到一个正好是遮罩区域大小的矩形,但我不知道有效的方法。

换句话说,未屏蔽像素的值为0,屏蔽像素的值大于0,所以我想得到一个矩形,其中...

*top=值〉0的轴0的最小索引
*bottom=值〉0的轴0的最大索引
*=值〉0的最小索引轴1
*=值〉0的最大索引轴1
*图像=源代码[顶部:左下角:右对齐]
我的代码如下

segmentation = cv2.ximgproc.segmentation.createGraphSegmentation()
src = cv2.imread('image_file')
segment = segmentation.processImage(src)
for i in range(np.max(segment)):
    dst = np.array(src)
    dst[segment != i] = 0
    cv2.imwrite('output_file', dst)
3htmauhk

3htmauhk1#

如果您更喜欢纯Numpy,可以使用np.wherenp.meshgrid来实现:

i, j = np.where(mask)
indices = np.meshgrid(np.arange(min(i), max(i) + 1),
                      np.arange(min(j), max(j) + 1),
                      indexing='ij')
sub_image = image[indices]

np.where返回数组元组,成对指定mask中每个非零元素在每个轴上的索引。然后,我们使用np.arange创建所有行和列索引的数组。并使用np.meshgrid生成两个网格形状的数组,这些数组对我们感兴趣的图像部分进行索引。注意,我们指定matrix-使用index='ij'建立样式索引,以避免必须转置结果(预设为Cartesian样式索引)。
本质上,meshgrid构造indices,使得:

image[indices][a, b] == image[indices[0][a, b], indices[1][a, b]]

示例

从以下内容开始:

>>> image = np.arange(12).reshape((4, 3))
>>> image
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

假设我们要提取[[3,4],[6,7]]子矩阵,它是以下掩码的边界矩形:

>>> mask = np.array([[0,0,0],[0,1,0],[1,0,0],[0,0,0]])
>>> mask
array([[0, 0, 0],
       [0, 1, 0],
       [1, 0, 0],
       [0, 0, 0]])

然后,应用上述方法:

>>> i, j = np.where(mask)
>>> indices = np.meshgrid(np.arange(min(i), max(i) + 1), np.arange(min(j), max(j) + 1), indexing='ij')
>>> image[indices]
array([[3, 4],
       [6, 7]])

这里,indices[0]是行索引的矩阵,而indices[1]是列索引的对应矩阵:

>>> indices[0]
array([[1, 1],
       [2, 2]])
>>> indices[1]
array([[0, 1],
       [0, 1]])
watbbzwu

watbbzwu2#

我认为使用np.amaxnp.amin并裁剪图像要快得多。

i, j = np.where(mask)
indices = np.meshgrid(np.arange(min(i), max(i) + 1),
              np.arange(min(j), max(j) + 1),
              indexing='ij')
sub_image = image[indices]

所用时间:50毫秒

where = np.array(np.where(mask))

x1, y1 = np.amin(where, axis=1)
x2, y2 = np.amax(where, axis=1)
sub_image = image[x1:(x2+1), y1:(y2+1)]

所用时间:5.6毫秒

vlju58qv

vlju58qv3#

在运行这两个方法时,我没有得到Hans的结果(使用NumPy 1.18.5)。

i, j = np.where(mask)
y, x = np.meshgrid(
    np.arange(min(i), max(i) + 1),
    np.arange(min(j), max(j) + 1),
    indexing="ij",
)

耗时38毫秒

where = np.array(np.where(mask))
y1, x1 = np.amin(where, axis=1)
y2, x2 = np.amax(where, axis=1) + 1
sub_image = image[y1:y2, x1:x2]

耗时35毫秒

maskx = np.any(mask, axis=0)
masky = np.any(mask, axis=1)
x1 = np.argmax(maskx)
y1 = np.argmax(masky)
x2 = len(maskx) - np.argmax(maskx[::-1])
y2 = len(masky) - np.argmax(masky[::-1])
sub_image = image[y1:y2, x1:x2]

耗时2毫秒
Timings script

相关问题