這是我的做法。
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 ->(因為補丁中有 196 個像素14 x 14)而不是 50。請問我該怎么做?
uj5u.com熱心網友回復:
img根據第一行的注釋,我假設尺寸是 BCHW。您可以在 for 回圈中逐像素更改值(這非常低效):
img[0, :, y, x] = rgb
或者您可以更改整個補丁。假設img是 Numpyndarray并且您想降低強度:
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是補丁大小。3x100x100gradient張量也是如此。我通過獲取形狀強度的向量 (100,) 并將其平鋪使其成為 3x100x100 張量來創建它。最后一行是 in 中的每個值乘以 in 中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-d 矢量rgb將被廣播到patch_hx patch_wx3張量。相同的邏輯適用于 Python native 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])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/483310.html
