一般情况下,空间域的图像是f(x, y) = 灰度级(0-255),形象一点就是一个二维矩阵,每一个坐标对应一个颜色值。
#快速傅里叶变换算法得到频率分布 f = np.fft.fft2(img) #默认结果中心点位置在左上角,转移到中间 fshift = np.fft.fftshift(f) #fshift是复数,求绝对值结果才是振幅 magnitude_spectrum = np.log(np.abs(fshift)) plt.subplot(121),plt.imshow(img, cmap='gray') plt.title('Input Image'),plt.xticks([]),plt.yticks([]) plt.subplot(122),plt.imshow(magnitude_spectrum, cmap='gray') plt.title('Magnitude Spectrum'),plt.xticks([]),plt.yticks([]) plt.show()
f = np.fft.fft2(img) fshift = np.fft.fftshift(f) #取绝对值:将复数变成实数 #取对数的目的为了将数据变化到0-255 s1 = np.log(np.abs(fshift)) #求相位 s1_angle = np.angle(fshift) plt.subplot(221),plt.imshow(img, cmap='gray'),plt.title('original') plt.subplot(222),plt.imshow(s1, 'gray'),plt.title('center') plt.subplot(223),plt.imshow(s1_angle, 'gray'),plt.title('angel') #逆变换 f1shift = np.fft.ifftshift(fshift) img_back = np.fft.ifft2(f1shift) #出来的复数,无法显示,转成实数 img_back = np.abs(img_back) plt.subplot(224),plt.imshow(img_back, 'gray'),plt.title('img back') plt.show()
f = np.fft.fft2(img) fshift = np.fft.fftshift(f) # 取绝对值: 将复数变成实数 # 取对数是为了将数据变换到0-255 s1 = np.log(np.abs(fshift)) plt.subplot(221),plt.imshow(img, 'gray'),plt.title('original') plt.xticks([]), plt.yticks([]) #------------------------------------- #逆变换 -- 取绝对值就是振幅 f1shift = np.fft.ifftshift(np.abs(fshift)) img_back = np.fft.ifft2(f1shift) img_back = np.abs(img_back) plt.subplot(222),plt.imshow(img_back, 'gray'),plt.title('only Amplitude') plt.xticks([]),plt.yticks([]) #------------------------------------ #逆变换 -- 取相位 f2shift = np.fft.ifftshift(np.angle(fshift)) img_back = np.fft.ifft2(f2shift) #结果是复数,无法显示 img_back = np.abs(img_back) plt.subplot(223), plt.imshow(img_back, 'gray'), plt.title('only phase') plt.xticks([]), plt.yticks([]) #------------------------------------ #逆变换--将两者结合看看 s1 = np.abs(fshift) # 取振幅 s1_angle = np.angle(fshift) # 取相位 s1_real = s1*np.cos(s1_angle) # 取实部 s1_imag = s1*np.sin(s1_angle) # 去虚部 s2 = np.zeros(img.shape, dtype=complex) s2.real = np.array(s1_real) # 重新赋值给s2 s2.imag = np.array(s1_imag) #对新的进行逆变换 f3shift = np.fft.ifftshift(s2) img_back = np.fft.ifft2(f3shift) img_back = np.abs(img_back) plt.subplot(224), plt.imshow(img_back, 'gray'), plt.title('another way') plt.xticks([]), plt.yticks([]) plt.show()
img_1 = cv.imread('img/WindowsLogo.jpg', 0) img_2 = cv.imread('img/LinuxLogo.jpg', 0) plt.subplot(221), plt.imshow(img_1, 'gray'), plt.title('original_1') plt.xticks([]), plt.yticks([]) plt.subplot(222), plt.imshow(img_2, 'gray'), plt.title('original_2') plt.xticks([]), plt.yticks([]) #---------------------------- f1 = np.fft.fft2(img_1) f1shift = np.fft.fftshift(f1) f1_A = np.abs(f1shift) # 取振幅 f1_P = np.angle(f1shift) # 取相位 #----------------------------- f2 = np.fft.fft2(img_2) f2shift = np.fft.fftshift(f2) f2_A = np.abs(f2shift) # 取振幅 f2_P = np.angle(f2shift) # 取相位 #--------图1的振幅--图2的相位----- img_new_1 = np.zeros(img_1.shape, dtype=complex) img_new_1_real = f1_A * np.cos(f2_P) # 取实部 img_new_1_imag = f1_A * np.sin(f2_P) # 取虚部 img_new_1.real = img_new_1_real img_new_1.imag = img_new_1_imag # 对新图像赋值 f3shift = np.fft.ifftshift(img_new_1) # 对新的图像进行逆变换 img_new_1_back = np.fft.ifft2(f3shift) #结果是复数,无法显示 img_new_1_back = np.abs(img_new_1_back) plt.subplot(223), plt.imshow(img_new_1_back, 'gray'), plt.title('img1_A img2_P') plt.xticks([]), plt.yticks([]) #-------图1的相位--图2的振幅--------- img_new_2 = np.zeros(img_2.shape, dtype=complex) img_new_2_real = f2_A * np.cos(f1_P) # 取实部 img_new_2_imag = f2_A * np.sin(f1_P) # 取虚部 img_new_2.real = img_new_2_real img_new_2.imag = img_new_2_imag #对新图像赋值 f4shift = np.fft.ifftshift(img_new_2) # 对新的图像进行逆变换 img_new_2_back = np.fft.ifft2(f4shift) #结果是复数,无法显示 img_new_2_back = np.abs(img_new_2_back) plt.subplot(224), plt.imshow(img_new_2_back, 'gray'), plt.title('img1_P img2_A') plt.xticks([]), plt.yticks([]) plt.show()
rows, cols = img.shape #宽高的1/2 取中心坐标 crow, ccol = int(rows / 2), int(cols / 2) #60 * 60 的矩形窗口,去除低频分量 fshift[crow-30:crow+30,ccol-30:ccol+30] = 0 #进行逆平移操作,直流分量又回到左上角 f_shift = np.fft.ifftshift(fshift) #进行FFT逆变换 img_back = np.fft.ifft2(f_shift) #取绝对值 img_back = np.abs(img_back) plt.subplot(131),plt.imshow(img, cmap='gray') plt.title('Input Image'),plt.xticks([]),plt.yticks([]) plt.subplot(132), plt.imshow(img_back, cmap='gray') plt.title('Image after HPF'), plt.xticks([]), plt.yticks([]) plt.subplot(133), plt.imshow(img_back) plt.title('Result in JET'), plt.xticks([]), plt.yticks([]) plt.show()
plt.subplot(131), plt.imshow(img, 'gray'), plt.title('original') plt.xticks([]), plt.yticks([]) rows, cols = img.shape crow, ccol = int(rows/2), int(cols/2) # -------高通滤波--------- mask = np.ones(img.shape, np.uint8) mask[crow - 30:crow + 30, ccol - 30:ccol + 30] = 0 f1 = np.fft.fft2(img) f1shift = np.fft.fftshift(f1) f1shift = f1shift * mask f2shift = np.fft.ifftshift(f1shift) # 对新得到图像进行逆变换 img_new = np.fft.ifft2(f2shift) img_new = np.abs(img_new) plt.subplot(132), plt.imshow(img_new, 'gray'), plt.title('Highpass') plt.xticks([]), plt.yticks([]) # --------低通滤波--------- mask2 = np.zeros(img.shape, np.uint8) mask2[crow - 30:crow + 30, ccol - 30:ccol + 30] = 1 f1 = np.fft.fft2(img) f1shift = np.fft.fftshift(f1) f1shift = f1shift * mask2 f2shift = np.fft.ifftshift(f1shift) # 对新得到图像进行逆变换 img_new = np.fft.ifft2(f2shift) img_new = np.abs(img_new) plt.subplot(133), plt.imshow(img_new, 'gray'), plt.title('Lowpass') plt.xticks([]), plt.yticks([]) plt.show()
plt.subplot(121), plt.imshow(img, 'gray'), plt.title('original') plt.xticks([]), plt.yticks([]) #----------------------------- rows, cols = img.shape crow, ccol = int(rows/2), int(cols/2) #高通滤波器 mask1 = np.ones(img.shape, np.uint8) mask1[crow-8:crow+8, ccol-8:ccol+8] = 0 #低通滤波器 mask2 = np.zeros(img.shape, np.uint8) mask2[crow-80:crow+80, ccol-80:ccol+80] = 1 #带通滤波器 mask = mask1 * mask2 #---------------------------------- f1 = np.fft.fft2(img) f1shift = np.fft.fftshift(f1) f1shift = f1shift * mask #对新得到的图像进行逆变换 f2shift = np.fft.ifftshift(f1shift) img_new = np.fft.ifft2(f2shift) img_new = np.abs(img_new) plt.subplot(122), plt.imshow(img_new, 'gray'), plt.title('new image') plt.xticks([]), plt.yticks([]) plt.show()
#对一些算子进行比较 def demo5(): mean_filter = np.ones((3, 3)) x = cv.getGaussianKernel(5, 10) guassian = x * x.T scharr = np.array([[-3, 0, -3], [-10, 0, -10], [-3, 0, 3]]) sobel_x = np.array([[-1, 0, 1], [-2, 0, -2], [-1, 0, 1]]) sobel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]]) laplacian = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]]) #我看有两个版本的laplacian算子,这个博客给了解释https://www.cnblogs.com/german-iris/p/4840647.html filters = [mean_filter, guassian, laplacian, sobel_x, sobel_y, scharr] filter_name = ['mean_filter', 'guassian', 'laplacian', 'sobel_x', 'sobel_y', 'scharr'] fft_filters = [np.fft.fft2(x) for x in filters] fft_shift = [np.fft.fftshift(x) for x in fft_filters] mag_spectrum = [np.log(np.abs(x)+1) for z in fft_shift] for i in range(6): plt.subplot(2, 3, i+1),plt.imshow(mag_spectrum[i], 'gray') plt.title(filter_name[i]),plt.xticks([]),plt.yticks([]) plt.show()
从结果我们可以看出:mean_filter、guassian算子是LPH,laplacian、sobel、scharr算子是HPF