如何使用 np.linspace() 更改图像中补丁的像素颜色

How do I use np.linspace() to change the pixels colors of a patch in an image

我通过改变下图中50个像素的颜色画了一条直线。这条线就是图中显示的对角线

我是这样做的。

zeros = torch.zeros_like(img) #img is b,c,h,w

x1, y1, x2, y2, r, g,  b = 16, 50, 100, 100, 6, 2, 4
rgb = torch.tensor([r, g, b])
cx, cy = x2 - x1, y2 - y1

for t in np.linspace(0, 1, 50):
    px, py = x1 + t * cx, y1 + t * cy
    zeros[0, :, int(py), int(px)] = rgb

mask = (zeros == 0).float()
im = mask * img + (1 - mask) *zeros

np.linspace(0, 1, 50)中很明显,我正在更改 50 个像素。我想使用 相同的方法 更改图像的特定部分,例如图像的 14 x 14 补丁,如果图像大小为 224 x 224 甚至更大.现在要覆盖的像素范围将是 196 ->(因为 14 x 14 补丁中有 196 个像素)而不是 50。请问我该怎么做?

我假设 img 维度是基于第一行注释的 BCHW。 您可以在 for 循环中逐个像素地更改值(这是非常低效的):

img[0, :, y, x] = rgb

或者您可以更改整个补丁。假设 img 是 Numpy ndarray 并且您想降低强度:

img[0, :, 100:200, 100:200] = (img[0, :, 100:200, 100:200] / 1.3).astype(np.uint8)

只需注意维度和数据类型。您必须将结果转换为 uint8,与原始图像相同。

要在补丁上设置一些强度梯度:

gradient = np.tile(np.linspace(0.2, 0.9, 100), (3, 100, 1))
img[0, :, 100:200, 100:200] = (img[0, :, 100:200, 100:200] * gradient).astype(np.uint8)

这里 0.2-0.9 是强度,100 是补丁大小。所以 gradient 是 3x100x100 张量。我通过获取形状强度矢量 (100,) 并将其平铺使其成为 3x100x100 张量来创建它。最后一行是 img 中的每个值乘以 gradient.

中的相应值

处理图像时,以 HWC 格式表示它们会更方便。您可以通过编写

轻松实现
img = img[0].transpose(1,2,0)

这将交换维度 CHW->HWC(因为通过索引 [0] 删除了 Batch)。然后你可以轻松写:

img[y:y+patch_h, x:x+patch_w] = rgb

和 Python 将自动尝试填充缺失的尺寸。在这种情况下,3 维向量 rgb 将是 broadcastedpatch_hxpatch_wx3 张量。同样的逻辑适用于 Python 原生 arrays、NumPy ndarray、Pytorch 和 TF 张量。然后你可以(例如)通过

翻转一个补丁
img[y:y+patch_h, x:x+patch_w] = np.fliplr(img[y:y+patch_h, x:x+patch_w])