**我有一个图像和一个遮罩。两者都是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)
3条答案
按热度按时间3htmauhk1#
如果您更喜欢纯Numpy,可以使用
np.where
和np.meshgrid
来实现:np.where
返回数组元组,成对指定mask
中每个非零元素在每个轴上的索引。然后,我们使用np.arange
创建所有行和列索引的数组。并使用np.meshgrid
生成两个网格形状的数组,这些数组对我们感兴趣的图像部分进行索引。注意,我们指定matrix-使用index='ij'
建立样式索引,以避免必须转置结果(预设为Cartesian样式索引)。本质上,
meshgrid
构造indices
,使得:示例
从以下内容开始:
假设我们要提取
[[3,4],[6,7]]
子矩阵,它是以下掩码的边界矩形:然后,应用上述方法:
这里,
indices[0]
是行索引的矩阵,而indices[1]
是列索引的对应矩阵:watbbzwu2#
我认为使用
np.amax
和np.amin
并裁剪图像要快得多。所用时间:50毫秒
所用时间:5.6毫秒
vlju58qv3#
在运行这两个方法时,我没有得到Hans的结果(使用NumPy 1.18.5)。
耗时38毫秒
耗时35毫秒
耗时2毫秒
Timings script