使用numpy用图案掩盖图像?

Ned*_*der 20 python numpy image-processing

我正在使用numpy来构建像素数组.800x600图像是uint8,800x600x3的三维数组.我也有一个固定模式的类似阵列(棋盘,见这里).我有另一个数组,800x600的掩码值.在掩模为零的情况下,我想将图案像素复制到图像像素.在掩模不为零的情况下,我想单独保留图像像素.

>>> image.shape
(800, 600, 3)
>>> chex.shape
(800, 600, 3)
>>> mask.shape
(800, 600)
Run Code Online (Sandbox Code Playgroud)

这感觉它应该工作:

image[mask == 0,...] = chex
Run Code Online (Sandbox Code Playgroud)

但是给出了"ValueError:数组不能播放到正确的形状".

我该怎么用来将chex像素复制到mask为零的图像像素?

unu*_*tbu 23

idx=(mask==0)
image[idx]=chex[idx]
Run Code Online (Sandbox Code Playgroud)

注意image有形状(800,600,3),而idx形状(800,600).索引状态的规则

如果选择元组小于n,那么尽可能多:根据需要将对象添加到选择元组的末尾,以便修改的选择元组具有长度N.

因此索引数组具有自己的一种广播能力.idx的形状被提升为(800,600,:)


Jon*_*Jon 5

我想用@unutbu 答案来说明一个例子。在这种情况下,我旋转了一张猫的图像。这种旋转会导致一些黑色边缘看起来很难看,尤其是粘贴在非黑色背景上时。

import matplotlib.pyplot as plt
from scipy.ndimage import rotate


cat = plt.imread('cat.jpeg')
bg = plt.imread('background.jpeg')


rotcat = rotate(cat, angle=8, reshape=True) ## rotating creates some black edges
height, width, _ = rotcat.shape

bgcopy = bg.copy() ## create a copy of the background; paste on copy

x, y = 40, 50 
bgcopy[x:x+height, y:y+width] = rotcat
plt.imsave('cat-on-bg-mask.jpg', bgcopy)
Run Code Online (Sandbox Code Playgroud)

粘贴不良

因此,我找到蒙版的区域并将这些值替换为原始背景值

mask_ind = (bgcopy == 0)
bgcopy[mask_ind] = bg[mask_ind]
plt.imsave('cat-on-bg.jpg', bgcopy)
Run Code Online (Sandbox Code Playgroud)

粘贴好

我还应该注意到PIL.Image(来自Pillow库)能够以更少的步骤将图像粘贴到另一个图像上。