在numpy中结合广播和布尔数组索引以实现图像屏蔽

vvppvyoh  于 2021-09-08  发布在  Java
关注(0)|答案(2)|浏览(350)

我正在处理一个图像处理/建筑问题。我有一个较小的图像,我想放在一个较大的。正常情况下,图像表示为3d阵列。这适用于以下代码(两者都是 element_pixelsimage_pixels 深度为3的3d Ndarray表示rgb, element_pixels 等于或小于 image_pixels 在其他方面):

element_pixels = element.get_pixels()
        image_pixels[element.position[0]:element.position[0]+element.height, element.position[1]:element.position[1]+element.width, :] = element_pixels

但是,我希望将元素中的黑色像素视为透明。最简单的方法是屏蔽元素,这样我就不会修改元素为黑色的图像像素。我尝试了以下方法,但我陷入了困境:

element_pixels = element.get_pixels()
        b = np.all(element_pixels == [0, 0, 0], axis=-1)
        black_pixels_mask = np.dstack([b,b,b])
        image_pixels[element.position[0]:element.position[0]+element.height, element.position[1]:element.position[1]+element.width, :][black_pixels_mask] = element_pixels

这看起来正确地生成了一个掩码,但我不知道如何使用它。我得到以下错误:
image\u pixels[element.position[0]:element.position[0]+element.height,element.position[1]:element.position[1]+element.width,:][black\u pixels\u mask]=element\u pixels类型错误:numpy布尔数组索引分配需要0或一维输入,输入有3维
如果我更换最终产品,屏蔽类型的工作(即无例外运行) = element_pixels 一个常数,但我很难推断出一个解决方案。
尺寸的额外细节

element_pixels.shape=(40, 40,3)
image_pixels.shape=(100, 100,3)

image_pixels[element.position[0]:element.position[0]+element.height, element.position[1]:element.position[1]+element.width, :].shape = (40,40,3)

2d中的mre这捕获了我在没有额外维度复杂性的情况下试图做的事情。

import numpy as np

bg = np.ones((10,10))*0.5
img = np.concatenate([np.zeros((5,1)),np.ones((5,1))], axis=1)

mask = img == 0

# copy the *non-zero* pixel values of img to a particular location in bg

bg[5:10,5:7][mask] = img # this throws exception

print(bg)
n53p2ov0

n53p2ov01#

你可以在3d阵列上使用2d遮罩。所以像这样的东西会取代所有的黑色像素 img 与那些 background .

img = np.random.randint(0, 2, (10, 10, 3))
background = np.random.randint(0, 2, (10, 10, 3))
mask = np.all(img == [0,0,0], axis=2)
img[mask] = background[img]

我不确定我是否理解其中的含义 image_pixels 但我认为你也可以做类似的事情。

qqrboqgw

qqrboqgw2#

经过一些实验后,我发现(事后看来可能很明显)答案是,你必须在两边都戴上面具。
以我的mre为例:

import numpy as np

bg = np.ones((10,10))*0.5
img = np.concatenate([np.zeros((5,1)),np.ones((5,1))], axis=1)
mask = img > 0

bg[5:10,5:7][mask] = img[mask]

print(bg)

或者回到我的原始代码,唯一改变的一行是:

image_pixels[element.position[0]:element.position[0]+element.height, element.position[1]:element.position[1]+element.width, :][~black_pixels_mask] = element_pixels[~black_pixels_mask]

相关问题