这几天在学习对抗样本,想实现对图片的随机遮挡,但是网上搜到的代码都是遮挡一块区域的,不是很满意,就自己写了一个,这个实现比较简陋,还有很大的改进空间,两个循环都可以用别的方法代替来加速。
img为Image的图片输入
raito为遮挡的多少,例如0.5就是遮挡一般
part_h和part_w为遮挡块的大小
import random
from PIL import Image
import numpy as np
def occlusion(img,raito=0.5,part_h=10,part_w=10):
img=np.array(img)
h=img.shape[0]
w=img.shape[1]
num_h=int(h/part_h)
num_w=int(w/part_w)
indexs=[]
for x in range(num_h+1):
for y in range(num_w+1):
indexs.append([x,y])
random.shuffle(indexs)
# print(int(len(indexs)*raito))
indexs=indexs[:int(len(indexs)*raito)]
# print(len(indexs))
for x,y in indexs:
img[part_h*x:part_h*(x+1),part_w*y:part_w*(y+1),:]=0
img=Image.fromarray(img)
return img
img=Image.open('./data/10/test/0/1.jpg')
img=occlusion(img)
img.save('./data/10/test/0/0.jpg')
原图:
效果图