import numpy as np
import os
import cv2

source_file = "D:/random_erasing_testdata4/"  # 原始文件地址
target_file = "D:/random_erasing_testdata4_output18/"  # 修改后的文件地址
num = 424  # 产生图片次数


def random_erasing(img, p=1, sl=0.01, sh=0.2, r1=0.3, r2=0.5):
    target_img = img.copy()

    if p < np.random.rand():
        # RandomErasingを実行しない
        return target_img

    H, W, _ = target_img.shape
    S = H * W

    while True:
        Se = np.random.uniform(sl, sh) * S  # 画像に重畳する矩形の面積
        re = np.random.uniform(r1, r2)  # 画像に重畳する矩形のアスペクト比

        He = int(np.sqrt(Se * re))  # 画像に重畳する矩形のHeight
        We = int(np.sqrt(Se / re))  # 画像に重畳する矩形のWidth

        # choose = np.random.randint(0, 2)
        # print(choose)
        # if choose == 0:
        #     xe = np.random.randint(0, W/3)  # 画像に重畳する矩形のx座標
        # if choose == 1:
        #     xe = np.random.randint(W*2/3, W)  # 画像に重畳する矩形のx座標

        xe = np.random.randint(0, W)  # 画像に重畳する矩形のx座標
        ye = np.random.randint(0, H/5)  # 画像に重畳する矩形のy座標

        if xe + We <= W and ye + He <= H:
            # 画像に重畳する矩形が画像からはみ出していなければbreak
            break

    mask = np.random.randint(0, 255, (He, We, 3)) # 矩形がを生成 矩形内の値はランダム値
    target_img[ye:ye + He, xe:xe + We, :] = mask # 画像に矩形を重畳

    return target_img


if not os.path.exists(target_file):  # 如果不存在target_file，则创造一个
    os.makedirs(target_file)


for i in range(num):
    print("Processing: ", str(i))
    file_list = os.listdir(source_file)
    img = cv2.imread(source_file + file_list[i])
    new_img = random_erasing(img)
    cv2.imwrite(target_file + file_list[i], new_img)
