9.27学习内容
看了 main_dpir_deblur.py
第一遍开始有些看不懂,第二遍懂一些了,第三遍使用debug跟着数据走了一遍,还是有些不是很懂
torch.clamp/np.clip
clamp_:in-place类型是指,但在一个tensor上操作了之后,是直接修改了这个tensor
clamp:返回一个新的tensor,而旧的tensor并不修改。
torch.clamp(input, min, max, out=None) → Tensor
将输入input
张量每个元素的夹紧到区间 [min,max][min,max],并返回结果到一个新张量。
| min, if x_i < min
y_i = | x_i, if min <= x_i <= max
| max, if x_i > max
hdf5storage.loadmat
kernels = hdf5storage.loadmat(os.path.join('kernels', 'Levin09.mat'))['kernels'] ## 读取matlab数据的值
scipy.ndimage.filters.convolve函数
def convolve(input, weights, output=None, mode='reflect', cval=0.0,
origin=0)
函数定义如上,其中weight代表卷积核/滤波器,mode代表填充方式,cval代表使用常数填充时的常数值,origin代表卷积核的中心位置偏移。函数返回值代表处理后的结果。
np.rot90
np.flipud(img)#将矩阵上下翻转,输入图像的话,翻转后生成新的图像
np.rot90(img)#将矩阵img逆时针旋转90°
np.flipud(np.rot90(img))#旋转90°后在上下翻转
#将矩阵A逆时针旋转(90×k)°以后返回B,k取负数时表示顺时针旋转。
np.rot90(img,k=2)
np.tile
对某一维进行扩充,默认是x轴
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i27L9cuY-1632758458221)(E:\book\blog\note\9.27\image-20210927191815918.png)]
如果有多个,第一个是y,第二个是x,x因为是1所以不会再复制了
torch.roll(input, shifts, dims=None) → Tensor
- input (Tensor) —— 输入张量。
- shifts (python:int 或 tuple of python:int) —— 张量元素移位的位数。如果该参数是一个元组(例如shifts=(x,y)),dims必须是一个相同大小的元组(例如dims=(a,b)),相当于在第a维度移x位,在b维度移y位
- dims (int 或 tuple of python:int) 确定的维度。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-88kyUizY-1632758458222)(E:\book\blog\note\9.27\image-20210927203024112.png)]
傅里叶变换
将点扩展函数转换为光学传递函数。 otf = p2o(psf) 计算点扩展函数 (PSF) 阵列的快速傅立叶变换 (FFT),并创建不受 PSF 偏心影响的光学传递函数 (OTF) 阵列。
def p2o(psf, shape):
'''
Convert point-spread function to optical transfer function.
otf = p2o(psf) computes the Fast Fourier Transform (FFT) of the
point-spread function (PSF) array and creates the optical transfer
function (OTF) array that is not influenced by the PSF off-centering.
将点扩展函数转换为光学传递函数。 otf = p2o(psf) 计算点扩展函数 (PSF) 阵列的快速傅立叶变换 (FFT),并创建不受 PSF 偏心影响的光学传递函数 (OTF) 阵列。
Args:
psf: NxCxhxw
shape: [H, W]
Returns:
otf: NxCxHxWx2
'''
otf = torch.zeros(psf.shape[:-2] + shape).type_as(psf)
otf[...,:psf.shape[2],:psf.shape[3]].copy_(psf)
for axis, axis_size in enumerate(psf.shape[2:]): ## 中心化!
otf = torch.roll(otf, -int(axis_size / 2), dims=axis+2)
otf = torch.fft.fftn(otf, dim=(-2,-1)) ## 傅里叶变换
#n_ops = torch.sum(torch.tensor(psf.shape).type_as(psf) * torch.log2(torch.tensor(psf.shape).type_as(psf)))
#otf[..., 1][torch.abs(otf[..., 1]) < n_ops*2.22e-16] = torch.tensor(0).type_as(psf)
return otf
torch.conj
计算给定输入张量的元素共轭。 如果输入具有非复杂数据类型,则此函数仅返回输入。
>>>torch.conj(torch.tensor([-1 + 1j, -2 + 2j, 3 - 3j]))
tensor([-1 - 1j, -2 - 2j, 3 + 3j])
numpy.ceil()函数和numpy.floor()函数解读
np.ceil(a) ,np.floor(a) : 计算各元素的ceiling 值, floor值(ceiling向上取整,floor向下取整)