# date  : 2020.3.30import osimport cv2import randomimport numpy as npfrom matplotlib import pyplot as pltimport torchimport torch.nn.functional as Ffrom train_mnist import Net  ##重要,尽管显示灰色(即在次代码中没用到),但若没有引入这个模型代码,加载模型时会找不到模型from torch.autograd import Variableimport pandas as pdres = {}# 读取图像def FourierAddGauss_Blur(img, mu, sigma, k):    # 归一化解决    img = np.array(img / 255, dtype=float)    # 傅里叶变换    f = np.fft.fft2(img)    # print('Fourier Done')    fshift = np.fft.fftshift(f)    print(fshift)    [rows, cols] = fshift.shape    for i in range(0, k):        for j in range(0, k):            # print('before')            # print(fshift[i][j])            f_real = fshift[i][j].real            f_imag = fshift[i][j].imag            f_real += random.gauss(mu, sigma)            fshift[i][j] = f_real + (1j * f_imag)            # print(fshift[i][j])    # print('Add GaussNoise to (0,10) real Done')    res = np.log(np.abs(fshift))    # 傅里叶逆变换    ishift = np.fft.ifftshift(fshift)    iimg = np.fft.ifft2(ishift)    iimg = np.abs(iimg)    # 自适应高斯滤波    out = cv2.GaussianBlur(iimg, (3, 3), 1)    # print('Gaussian Filter Done')    # # 滤波后频率图    # f_out = np.fft.fft2(out)    # fshift_out = np.fft.fftshift(f_out)    # res_out = np.log(np.abs(fshift_out))    # 展现后果    plt.subplot(221), plt.imshow(img, 'gray'), plt.title('Original Image')    plt.subplot(222), plt.imshow(res, 'gray'), plt.title('Fourier Image')    plt.subplot(223), plt.imshow(iimg, 'gray'), plt.title('Inverse Fourier Image')    plt.subplot(224), plt.imshow(out, 'gray'), plt.title('out Image')    # plt.subplot(325), plt.imshow(res_out, 'gray'), plt.title('Out Fourier Image')    plt.show()    return outdef FourierAddGauss_NoBlur(img, mu, var, k):    # 归一化解决    img = np.array(img / 255, dtype=float)    # 傅里叶变换    f = np.fft.fft2(img)    # print('Fourier Done')    fshift = np.fft.fftshift(f)    [rows, cols] = img.shape    f_real = np.zeros(img.shape)    f_imag = np.zeros(img.shape)    for i in range(0, rows):        for j in range(0, cols):            f_real[i][j] = fshift[i][j].real            f_imag[i][j] = fshift[i][j].imag    # 生成高频高斯噪声    noise = np.random.normal(mu, var ** 0.5, img.shape)    for i in range(0, rows):        for j in range(0, cols):            if i > k or j > k:                noise[i][j] = 0    print("noise")    print(noise)    print("f_real")    print(f_real)    # 退出噪声    f_real = f_real + noise    for i in range(0, rows):        for j in range(0, cols):            fshift[i][j] = f_real[i][j] + (1j * f_imag[i][j])    res = np.log(np.abs(fshift))    # 傅里叶逆变换    print("fshift")    print(fshift)    ishift = np.fft.ifftshift(fshift)    iimg = np.fft.ifft2(ishift)    iimg = np.abs(iimg)    iimg = iimg * 255    # 自适应高斯滤波    out = cv2.GaussianBlur(iimg, (3, 3), 1)    # print('Gaussian Filter Done')    # # 滤波后频率图    # f_out = np.fft.fft2(out)    # fshift_out = np.fft.fftshift(f_out)    # res_out = np.log(np.abs(fshift_out))    # 展现后果    plt.subplot(221), plt.imshow(img, 'gray'), plt.title('Original Image')    plt.subplot(222), plt.imshow(res, 'gray'), plt.title('Fourier Image')    plt.subplot(223), plt.imshow(iimg, 'gray'), plt.title('Inverse Fourier Image')    plt.subplot(224), plt.imshow(out, 'gray'), plt.title('out Image')    # plt.subplot(325), plt.imshow(res_out, 'gray'), plt.title('Out Fourier Image')    plt.show()    return outdef train_pngAddGauss(root):    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')    model = Net()    model.load_state_dict(torch.load('mnist_cnn.pt'))  # 加载模型    model = model.to(device)    model.eval()  # 把模型转为test模式    # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test'    # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test_AddGaussion2000_NoFiltering'    # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test_AddGaussion_NoFiltering'    files_path = os.listdir(root)    print("start testing:...")    for png_name in files_path:        # print(png_name)        img = cv2.imread(root + "/" + png_name, 0)        # print(img.shape)        # img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 图片转为灰度图,因为mnist数据集都是灰度图        img = np.array(img).astype(np.float32)        img = np.expand_dims(img, 0)        img = np.expand_dims(img, 0)  # 扩大后,为[1,1,28,28]        img = torch.from_numpy(img)        img = img.to(device)        output = model(Variable(img))        prob = F.softmax(output, dim=1)        prob = Variable(prob)        prob = prob.cpu().numpy()  # 用GPU的数据训练的模型保留的参数都是gpu模式的,要显示则先要转回cpu,再转回numpy模式        # print(prob)  # prob是10个分类的概率        pred = np.argmax(prob)  # 选出概率最大的一个        res[png_name] = pred.item()    print("train over")    data = pd.read_csv(r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test.csv')    right = 0    for key, val in res.items():        # print(key,val)        if int(data[data['pic_name'] == key]['label']) == val:            right = right + 1        # else:        #     print("Actually:" + key, val)        #     Wrong_pred = int(data[data['pic_name'] == key]['label'])        #     print("Wrong predicted:" + str(Wrong_pred))    acc = right / len(res)    print(acc)    return accdef gasuss_noise(image, mean=0, var=0.001):    # '''    #        增加高斯噪声    #      image:原始图像    #       mean : 均值    #       var : 方差,越大,噪声越大    # '''    image = cv2.imread(image)    image = np.array(image / 255, dtype=float)  # 将原始图像的像素值进行归一化,除以255使得像素值在0-1之间    noise = np.random.normal(mean, var ** 0.5, image.shape)  # 创立一个均值为mean,方差为var呈高斯分布的图像矩阵    out = image + noise  # 将噪声和原始图像进行相加失去加噪后的图像    if out.min() < 0:        low_clip = -1.    else:         low_clip = 0.    out = np.clip(out, low_clip, 1.0)  # clip函数将元素的大小限度在了low_clip和1之间了,小于的用low_clip代替,大于1的用1代替    out = np.uint8(out * 255)  # 解除归一化,乘以255将加噪后的图像的像素值复原    # cv.imshow("gasuss", out)    noise = noise * 255    return [noise, out]def dctAddLowFre(img,mu,var,k):    # 归一化解决    img = np.array(img / 255, dtype=float)    img_dct = cv2.dct(np.float32(img))    # img_dct_log = np.log(abs(img_dct))    # print('img_dct:')    # print(img_dct[0:k, 0:k])    # 生成低频噪声    # 学生成高斯噪声    noise = np.random.normal(mu, var ** 0.5, img.shape)  # 创立一个均值为mu,方差为var呈高斯分布的图像矩阵    # 对 GaussionNoise 进行剪裁    for i in range(noise.shape[0]):        for j in range(noise.shape[1]):            if i > k or j > k:                noise[i][j] = 0    # print('noise:')    # print(noise)    # 对 GaussionNoise 进行 IDCT 失去低频噪声    lowFre_noise = np.zeros(img.shape)    lowFre_noise[0:k, 0:k] = cv2.idct(noise[0:k, 0:k])    # print('lowFre_noise:')    # print(lowFre_noise[0:k, 0:k])    # 将 低频噪声 退出 img_dct    img_dct_AddLowFreNoise = img_dct + lowFre_noise    # print('img_dct_AddLowFreNoise')    # print(img_dct_AddLowFreNoise[0:k, 0:k])    # 解除归一化    img_dct_AddLowFreNoise = img_dct_AddLowFreNoise * 255    # 逆离散余弦变换,变换图像回实数域    img_idct = cv2.idct(img_dct_AddLowFreNoise)    img_idct_Blur = cv2.GaussianBlur(img_idct, (3, 3), 1)    # show result    plt.subplot(241), plt.imshow(img, 'gray'), plt.title('Img')    plt.subplot(242), plt.imshow(noise, 'gray'), plt.title('Gaussion Noise')    plt.subplot(243), plt.imshow(lowFre_noise, 'gray'), plt.title('Low Frequency Noise')    plt.subplot(244), plt.imshow(img_dct, 'gray'), plt.title('Img_dct')    plt.subplot(245), plt.imshow(img_dct_AddLowFreNoise, 'gray'), plt.title('Img_dct_AddLowFreNoise')    plt.subplot(246), plt.imshow(img_idct, 'gray'), plt.title('IDCT Image')    plt.subplot(247), plt.imshow(img_idct_Blur, 'gray'), plt.title('IDCT-Blur Image')    plt.show()    return img_idctdef train_pngAddLowFre(root,root_out,mu,var,k):    files_path = os.listdir(root)    for png_name in files_path:        img = cv2.imread(root + "/" + png_name, 0)        out = dctAddLowFre(img, mu, var, k)        cv2.imwrite(root_out + "/" + png_name, out)    train_pngAddGauss(root_out)def main():    # # test    # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test'    # root_out = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test_AddGaussion_NoFiltering'    #    # # # train    # # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\training\train'    # # root_out = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\training\train_AddGuassion4000_Filtering'    #    # files_path = os.listdir(root)    #    # array = [100,200,500,1000,1200,1500,2000,2500,3000,3500,4000,4500,5000]    # array2 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]    # k = 28    # for sigma in array2:    #     for png_name in files_path:    #         img = cv2.imread(root + "/" + png_name, 0)    #         # out = FourierAddGauss_Blur(img, 0, sigma, k)    #         out = FourierAddGauss_NoBlur(img, 0, sigma, k)    #         cv2.imwrite(root_out + "/" + png_name, out)    #    #     print(sigma)    #     train_pngAddGauss(root_out)    #单张图片测试    img = cv2.imread(r'D:\PythonProjects\Fourier\0.png',0)       #第一个参数是文件门路,可本人批改    out = FourierAddGauss_NoBlur(img, 0, 50, 10)    # # 单张图片测试    # # 离散余弦变换 并获取其幅频谱    # img = cv2.imread(r'D:\PythonProjects\Fourier\0.png', 0)    # img_addLowFre = dctAddLowFre(img, 0, 0.1, 10)    # # 数据集测试    # root = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test'    # root_out = r'D:\PythonProjects\Fourier\mnist_png_all_files_with_traincsv\testing\test_AddLowFre'    # mu = 0    # array_var = [0, 0.01, 0.02, 0.05, 0.1]    # array_var2 = [0.6, 0.7, 0.8, 0.9, 1]    # k = 10    #    # for var in array_var2:    #     print(var)    #     train_pngAddLowFre(root, root_out, mu, var, k)if __name__ == '__main__': main()