濾波分析又分為 時(shí)域分析、頻域分析:
- 時(shí)域分析: 直接對(duì)信號(hào)本身進(jìn)行分析。
- 頻域分析: 對(duì)信號(hào)的變化快慢進(jìn)行分析。
傅里葉變換可把信號(hào)從時(shí)間域轉(zhuǎn)換到頻率域,進(jìn)而研究信號(hào)的頻譜結(jié)構(gòu)和變化規(guī)律。
圖像濾波中空間域相當(dāng)于信號(hào)中的時(shí)間域,使用傅里葉變換和逆傅里葉變換可實(shí)現(xiàn)空域與頻域的相互轉(zhuǎn)換。傅里葉變換的物理意義是將圖像的灰度分布函數(shù)變換為圖像的頻率分布函數(shù)。圖像的頻率是表征圖像中灰度變化劇烈程度的指標(biāo),是灰度在平面空間上的梯度。對(duì)于邊界點(diǎn)或噪聲,其灰度值變化劇烈,是圖像中的高頻分量。
Numpy和OpenCV的傅里葉變換
圖像的傅里葉變換流程:
0.先將圖片轉(zhuǎn)化為灰度圖
-
1.將空域轉(zhuǎn)化為頻域-->傅里葉變換
??Numpy: FFT(Fast Fourier Transform) 快速傅里葉變換
????numpy.fft.fft2()
??OpenCV: DFT(Discrete Fourier Transform) 離散傅里葉變換
????dft(src, dst=None, flags=None, nonzeroRows=None)????示例: dft = cv2.dft(numpy.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT)
????src: 轉(zhuǎn)為numpy.float32類(lèi)型
????flags: 轉(zhuǎn)換的標(biāo)識(shí)符,默認(rèn)flags=0,表示正向變換。其他標(biāo)識(shí)符如下:
??????DFT_INVERSE = 1
??????DFT_SCALE = 2
??????DFT_ROWS = 4
??????DFT_COMPLEX_OUTPUT = 16
??????DFT_REAL_OUTPUT = 32
??????DFT_COMPLEX_INPUT = 64 2.中心化:將四周低頻移動(dòng)到圖像中心
??numpy.fft.fftshift3.進(jìn)行濾波操作(包括高頻、低頻等)
4.去中心化:將低頻和高頻的位置還原
??numpy.fft.ifftshift()5.將頻域轉(zhuǎn)化為空域-->逆傅里葉變換
??Numpy: numpy.fft.ifft2()
??OpenCV: cv2.idft()6.二維向量取模(幅值):
==>
??Numpy: numpy.abs(x + yj)
??OpenCV: cv2.magnitude(x, y)
1.Numpy中的FFT(快速傅里葉變換)
# 1.Numpy中的 FFT(Fast Fourier Transform) 快速傅里葉變換
import numpy
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("image/9.jpg")
# 0.轉(zhuǎn)化為灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
rows, cols = gray.shape
# 1.FFT快速傅里葉變換: 空域-->頻域
fft = numpy.fft.fft2(gray) # 參數(shù)為灰度圖
# 2.中心化: 將低頻移動(dòng)到圖像中心
fftshift = numpy.fft.fftshift(fft)
# 獲取振幅譜(展示圖片用): 20 * numpy.log()是為了將值限制在[0, 255]
magnitude_spectrum = 20 * numpy.log(numpy.abs(fftshift))
# 3.濾波操作之高通濾波(去低頻,保高頻)
fftshift[rows // 2 - 30:rows // 2 + 30, cols // 2 - 30: cols // 2 + 30] = 0
# 4.去中心化: 將低頻和高頻的位置還原
ifftshift = numpy.fft.ifftshift(fftshift)
# 5.逆傅里葉變換: 頻域-->空域
ifft = numpy.fft.ifft2(ifftshift)
# 6.二維向量取模(幅值)
img_back = numpy.abs(ifft)
# 結(jié)合matplotlib展示多張圖片
plt.figure(figsize=(10, 10))
plt.subplot(221), plt.imshow(gray, cmap="gray"), plt.title("Input Gray Image")
plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(magnitude_spectrum, cmap="gray"), plt.title("Magnitude Spectrum")
plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(img_back, cmap="gray"), plt.title("Image after HPF")
plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_back), plt.title("Result in JET") # 默認(rèn)cmap='jet'
plt.xticks([]), plt.yticks([])
plt.show()
2.OpenCV中的DFT(離散傅里葉變換)
# 2.OpenCV中的 DFT(Discrete Fourier Transform) 離散傅里葉變換
import numpy
import cv2
import matplotlib.pyplot as plt
img = cv2.imread("image/9.jpg")
# 0.轉(zhuǎn)化為灰度圖
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
rows, cols = gray.shape
# 1.DFT離散傅里葉變換: 空域-->頻域
dft = cv2.dft(src=numpy.float32(gray), flags=cv2.DFT_COMPLEX_OUTPUT) # src為灰度圖,并且是numpy.float32類(lèi)型
print(dft.shape)
# 2.中心化: 將低頻移動(dòng)到圖像中心
fftshift = numpy.fft.fftshift(dft)
# 獲取振幅譜(展示圖片用): 20 * numpy.log()是為了將值限制在[0, 255]
magnitude_spectrum = 20 * numpy.log(cv2.magnitude(fftshift[:, :, 0], fftshift[:, :, 1]))
# 3.濾波操作之低通濾波(去高頻,保低頻)
mask = numpy.zeros((rows, cols, 2), dtype=numpy.uint8)
mask[rows // 2 - 30: rows // 2 + 30, cols // 2 - 30: cols // 2 + 30] = 1
fftshift = fftshift * mask
# 4.去中心化: 將低頻和高頻的位置還原
ifftshift = numpy.fft.ifftshift(fftshift)
# 5.逆傅里葉變換: 頻域-->空域
idft = cv2.idft(ifftshift)
# 6.二維向量取模(幅值)
img_back = cv2.magnitude(idft[:, :, 0], idft[:, :, 1])
# 結(jié)合matplotlib展示多張圖片
plt.figure(figsize=(10, 10))
plt.subplot(221), plt.imshow(gray, cmap="gray"), plt.title("Input Gray Image")
plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(magnitude_spectrum, cmap="gray"), plt.title("Magnitude Spectrum")
plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(img_back, cmap="gray"), plt.title("Image after LPF")
plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_back), plt.title("Result in JET") # 默認(rèn)cmap='jet'
plt.xticks([]), plt.yticks([])
plt.show()