FFT去除规律条纹
一种非常强大的去除图像中规律条纹的工具,前提是你的图像是温和的大尺度结构,如果很多亮的点源,这是不可以的,因为亮的点源附近也是小尺度结构(还有一些是异常坏的数据过于亮,所以也要事先falg掉),本质上是对规律小尺度结构在FFT空间的去除,对去除fast上的扫描效应引起的条纹再合适不过
def FFT_rmstrips(data, flag_data=False):print('FFT_rmstripes_sun')if flag_data:print('自己手动nan掉一下明显的坏数据,这些数据会影响FFT的效果')data[571:626, 507:630] = np.nandata[2375:2429, 2054:2197] = np.nan# 记录NaN的位置#data = data[1500:2000]nan_mask = np.isnan(data)print(f"NaN像素数量: {np.sum(nan_mask)}")# 用0临时填充NaN进行FFT计算data = np.nan_to_num(data, nan=0.0)shape = data.shapeN = shape[1] #NAXIS1d_theta = 5.d = d_theta / (N-1)scale = 0.05 #影响fft的宽度section =0.06 #the value more big and range of cut-weight more short #scale = 0.5 #影响fft的宽度约小越宽#section = 0.04 #the value more big and range of cut-weight more short fft_data1 = fft.fft2(data)fft_data1_s = fft.fftshift(fft_data1)freq = fft.fftfreq(N, d) freq_s = fft.fftshift(freq)weight = 1 - np.cos(freq_s * scale * np.pi/2.) * np.cos(freq_s * scale * np.pi/2.)weight[np.abs(freq_s)> (1./scale)] = 1.weights_0 = np.zeros_like(fft_data1_s)shape = weights_0.shapefor i in range(shape[0]):weights_0[i] = weight #行#对权重cut之后的FFTrow = weights_0.shape[0]row1 = int(row*(1-section)/2)row2 = row-row1cut_weights_0 = np.ones_like(weights_0)for j in range(row):if j<=row1 or j>=row2:cut_weights_0[j] = weights_0[j]cut_fft_data1_s_w = fft_data1_s * cut_weights_0 #i_cut_weights_0 = fft.ifft2(fft.ifftshift(cut_weights_0))cut_fft_data = fft.ifftshift(cut_fft_data1_s_w)cut_data = fft.ifft2(cut_fft_data)cut_data.real[nan_mask] = np.nan #对那些nan值重复赋值回来check = Trueif check:fig = plt.figure(figsize=(18,18))#ax = fig.add_subplot(321)#ax.imshow(np.abs(np.abs(cut_weights_0 )))#ax.set_title('cut_weight')ax = fig.add_subplot(221)vmin1 = np.percentile(np.abs(fft_data1_s), 5)vmax1 = np.percentile(np.abs(fft_data1_s), 95) ax.imshow(np.abs(fft_data1_s), vmin = vmin1, vmax = vmax1)ax.set_title('fft-data')ax = fig.add_subplot(222)vmin1 = np.percentile(np.abs(cut_fft_data1_s_w), 5)vmax1 = np.percentile(np.abs(cut_fft_data1_s_w), 95) ax.imshow(np.abs(cut_fft_data1_s_w), vmin = vmin1, vmax = vmax1)ax.set_title('cut_fft_data1_s_w*weight')ax = fig.add_subplot(223)vmin1 = np.percentile(data, 5)vmax1 = np.percentile(data, 98)ax.imshow(data, origin='lower',vmin = vmin1, vmax = vmax1)ax.set_title('origin-data')ax = fig.add_subplot(224)ax.imshow(cut_data.real, origin='lower',vmin = vmin1, vmax = vmax1)ax.set_title('cut_data')plt.suptitle('section=%.2f and scale=%.2f' %(section,scale))plt.show()return cut_data.real