项目
Posted crab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目相关的知识,希望对你有一定的参考价值。
# date : 2020.3.30
import os
import cv2
import random
import numpy as np
from matplotlib import pyplot as plt
import torch
import torch.nn.functional as F
from train_mnist import Net ##重要,虽然显示灰色(即在次代码中没用到),但若没有引入这个模型代码,加载模型时会找不到模型
from torch.autograd import Variable
import pandas as pd
res = {}
# 读取图像
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 out
def 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 out
def 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 acc
def 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_idct
def 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()
以上是关于项目的主要内容,如果未能解决你的问题,请参考以下文章
片段中 ListView 的 setOnItemClickListener