我正在处理一个图像处理/建筑问题。我有一个较小的图像,我想放在一个较大的。正常情况下,图像表示为3d阵列。这适用于以下代码(两者都是 element_pixels
及 image_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)
2条答案
按热度按时间n53p2ov01#
你可以在3d阵列上使用2d遮罩。所以像这样的东西会取代所有的黑色像素
img
与那些background
.我不确定我是否理解其中的含义
image_pixels
但我认为你也可以做类似的事情。qqrboqgw2#
经过一些实验后,我发现(事后看来可能很明显)答案是,你必须在两边都戴上面具。
以我的mre为例:
或者回到我的原始代码,唯一改变的一行是: