def focusPsf(psf, thresh): x = np.linspace(0, 1, psf.shape[0]) y = np.linspace(0, 1, psf.shape[1]) col, row = np.meshgrid(x, y) # Don't have to normalize as psf should already be normalized cen_row = np.uint8(np.sum(row * psf)) cen_col = np.uint8(np.sum(col * psf)) temp_sum = 0 radius = 0 psf /= np.sum(psf) while temp_sum < thresh: radius += 1 return_psf = psf[cen_row-radius:cen_row+radius+1, cen_col-radius:cen_col+radius+1] temp_sum = np.sum(return_psf) #print(temp_sum) #print(radius, temp_sum) return return_psf, cen_row, cen_col
时间: 2023-06-25 14:06:03 浏览: 134
这是一个用于对点扩散函数(PSF)进行处理的函数。它的输入是一个PSF和一个阈值,输出是一个在阈值条件下聚焦于PSF中心的PSF,以及PSF中心点的行和列坐标。
该函数的实现过程如下:
- 首先,通过np.linspace()函数生成了x和y轴的网格点col和row。
- 然后,通过np.sum()函数计算了PSF的中心点的行和列坐标。
- 接着,将PSF除以其总和,以归一化PSF。
- 然后,使用while循环计算半径,直到PSF的总和大于等于阈值。
- 最后,返回在阈值条件下聚焦于PSF中心的PSF以及PSF中心点的行和列坐标。
需要注意的是,该函数中的np.uint8()函数将浮点数转换为无符号8位整数,这可能会导致精度损失。
相关问题
解释代码def genBlurImage(p_obj, img): smax = p_obj['delta0'] / p_obj['D'] * p_obj['N'] temp = np.arange(1,101) patchN = temp[np.argmin((smax*np.ones(100)/temp - 2)**2)] patch_size = round(p_obj['N'] / patchN) xtemp = np.round_(p_obj['N']/(2*patchN) + np.linspace(0, p_obj['N'] - p_obj['N']/patchN + 0.001, patchN)) xx, yy = np.meshgrid(xtemp, xtemp) xx_flat, yy_flat = xx.flatten(), yy.flatten() NN = 32 # For extreme scenarios, this may need to be increased img_patches = np.zeros((p_obj['N'], p_obj['N'], int(patchN**2))) den = np.zeros((p_obj['N'], p_obj['N'])) patch_indx, patch_indy = np.meshgrid(np.linspace(-patch_size, patch_size+0.001, num=2*patch_size+1), np.linspace(-patch_size, patch_size+0.001, num=2*patch_size+1)) for i in range(int(patchN**2)): aa = genZernikeCoeff(36, p_obj['Dr0']) temp, x, y, nothing, nothing2 = psfGen(NN, coeff=aa, L=p_obj['L'], D=p_obj['D'], z_i=1.2, wavelength=p_obj['wvl']) psf = np.abs(temp) ** 2 psf = psf / np.sum(psf.ravel()) focus_psf, _, _ = centroidPsf(psf, 0.85) #: Depending on the size of your PSFs, you may want to use this psf = resize(psf, (round(NN/p_obj['scaling']), round(NN/p_obj['scaling']))) patch_mask = np.zeros((p_obj['N'], p_obj['N'])) patch_mask[round(xx_flat[i]), round(yy_flat[i])] = 1 patch_mask = scipy.signal.fftconvolve(patch_mask, np.exp(-patch_indx**2/patch_size**2)*np.exp(-patch_indy**2/patch_size**2)*np.ones((patch_size*2+1, patch_size*2+1)), mode='same') den += scipy.signal.fftconvolve(patch_mask, psf, mode='same') img_patches[:,:,i] = scipy.signal.fftconvolve(img * patch_mask, psf, mode='same') out_img = np.sum(img_patches, axis=2) / (den + 0.000001) return out_img
这段代码实现了一个模糊图像的生成过程,下面是对代码的详细解析:
1. 首先计算出图像的最大模糊程度smax,以及每个小块的大小patchN。
2. 然后使用np.linspace函数创建一维数组xtemp,并使用np.meshgrid函数将其扩展为二维数组xx和yy。
3. 将xx和yy展平为一维数组xx_flat和yy_flat。
4. 创建一个大小为(N, N, patchN^2)的三维数组img_patches,用于存储每个小块的模糊图像。
5. 创建一个大小为(N, N)的二维数组den,用于存储每个像素点的权重。
6. 使用np.meshgrid函数创建patch_indx和patch_indy,用于计算每个小块的权重。
7. 对于每个小块,生成一个36阶的Zernike多项式系数aa,使用psfGen函数生成一个点扩散函数psf。
8. 对于每个小块,使用patch_mask计算出其在图像中的位置,并计算出其权重patch_weight。
9. 将patch_mask与一个高斯窗口卷积,得到patch_mask2。
10. 将patch_mask2与psf卷积,得到模糊图像img_patch。
11. 将img_patch和patch_weight加到img_patches和den中。
12. 对于所有小块,将img_patches沿着第三个维度求和,得到最终的模糊图像out_img。
这段代码的作用是生成一个模糊图像,其中包括多个小块,每个小块的模糊程度不同。它使用了Zernike多项式和点扩散函数来模拟光学系统的成像过程,以及高斯窗口来计算每个小块的权重。
def convert_otf2psf(otf, size): ker = torch.zeros(size).cuda() #psf = torch.fft.ifftn(otf, dim=(-3,-2,-1)) #psf = torch.stack((psf.real,psf.imag),-1) psf = torch.fft.ifft2(torch.complex(otf[...,0],otf[...,1]),dim=(-3,-2,-1)) psf = psf.real # circularly shift ksize = size[-1] centre = ksize//2 + 1 print(psf.size()) print(psf.type()) ker[:, :, (centre-1):, (centre-1):] = psf[:, :, :centre, :centre]#.mean(dim=1, keepdim=True) ker[:, :, (centre-1):, :(centre-1)] = psf[:, :, :centre, -(centre-1):]#.mean(dim=1, keepdim=True) ker[:, :, :(centre-1), (centre-1):] = psf[:, :, -(centre-1):, :centre]#.mean(dim=1, keepdim=True) ker[:, :, :(centre-1), :(centre-1)] = psf[:, :, -(centre-1):, -(centre-1):]#.mean(dim=1, keepdim=True) return ker这段代码报错, Warning: Casting complex values to real discards the imaginary part (function operator()),究竟是哪行代码的问题,该如何修改呢
这个警告信息来自于以下这行代码:
```
psf = psf.real
```
这行代码会将复数张量 `psf` 的实部提取出来,舍弃掉虚部。因此,如果你要保留复数张量的信息,可以不使用这行代码。
如果你需要将复数张量转换为实数张量,可以使用以下代码:
```
psf = torch.abs(psf)
```
这行代码会将复数张量 `psf` 的模长提取出来,转换为实数张量。
另外,如果你在使用 `torch.fft.ifft2()` 函数时遇到错误,可能是因为该函数的输入张量需要是一个 `torch.complex` 类型的张量。你可以使用以下代码将 `otf` 转换为 `torch.complex` 类型:
```
otf = torch.view_as_complex(otf)
```
这行代码会将 `otf` 转换为 `torch.complex` 类型,然后就可以将其作为 `torch.fft.ifft2()` 函数的输入了。
阅读全文