如何使用 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
将是 broadcasted 到 patch_h
xpatch_w
x3
张量。同样的逻辑适用于 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])
我通过改变下图中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
将是 broadcasted 到 patch_h
xpatch_w
x3
张量。同样的逻辑适用于 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])