0%

opencv_14_傅里叶变换

傅里叶变换

图像处理一般分为空间域处理频率域处理

空间域处理是直接对图像内的像素进行处理。空间域处理主要分为灰度变换和空间滤波变换两种形式。灰度变换是对图像内的单个像素进行处理,比如调节对比度和处理阈值等。空间滤波涉及图像质量的改变,例如图像平滑处理。空间域处理的计算简单方便,运算速度更快。

频率域处理是先将图像变换到频率域,然后在频率域对图像进行处理,最后再通过反变换将图像从频率域变换到空间域。傅里叶变换是应用最广泛的一种频域变换,它能够将图像从空间域变换到频率域,而逆傅里叶变换能够将频率域信息变换到空间域内。傅里叶变换在图像处理领域内有着非常重要的作用。

Numpy实现

Numpy实现傅里叶变换

1
2
3
4
import cv2
from get_show_img import get_show
import numpy as np
import matplotlib.pyplot as plt
1
2
3
4
5
img = cv2.imread('data/dog1.jpg', 0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
magnitude_spectrum = 20 * np.log(np.abs(fshift))
get_show(img, magnitude_spectrum)

output_5_0_202303091939

Numpy实现逆傅里叶变换

1
2
3
4
5
6
7
img = cv2.imread('data/dog1.jpg', 0)
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
ishift = np.fft.ifftshift(fshift) # 将零频率分量移动到频域中心
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
get_show(img, iimg)

output_7_0_202303091939

高通滤波

提取轮廓,边缘

在一幅图像内,同时存在高频信号和低频信号。

  • 低频信号对应图像内变化缓慢的灰度分量。例如,在一幅大草原的图像中,低频信号对应着趋于一致的广袤草原。
  • 高频信号对应图像内变化越来越快的灰度分量,是由灰度的尖锐过度造成的。如果在上面的大草原图像中还有一头狮子,那么高频信号就对应着狮子的边缘等信息。

    滤波器能够允许一定频率的分量通过或者拒绝其通过,按照其作用方式可以划分为低通滤波器高通滤波器
1
2
3
4
5
6
7
8
9
10
11
img = cv2.imread('data/dog1.jpg', 0)
cnum = 15
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
rows, cols = img.shape
crow, ccol = rows//2, cols//2
fshift[crow-cnum:crow+cnum, ccol-cnum:ccol+cnum] = 0
ishift = np.fft.ifftshift(fshift) # 将零频率分量移动到频域中心
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
get_show(img, iimg)

output_10_0_202303091939

低通滤波

边缘模糊化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
img = cv2.imread('data/dog1.jpg', 0)
cnum = 15
f = np.fft.fft2(img)
fshift = np.fft.fftshift(f)
rows, cols = img.shape
crow, ccol = rows//2, cols//2
fshift[:crow-cnum,] = 0
fshift[crow+cnum:,] = 0
fshift[:, :ccol-cnum] = 0
fshift[:, ccol+cnum:] = 0
ishift = np.fft.ifftshift(fshift) # 将零频率分量移动到频域中心
iimg = np.fft.ifft2(ishift)
iimg = np.abs(iimg)
get_show(img, iimg)

output_12_0_202303091939

OpenCV实现

使用opencv实现傅里叶变换

1
2
3
4
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
result = 20 * np.log(cv2.magnitude(dftShift[:, :, 0], dftShift[:, :, 1]))
get_show(img, result)

output_15_0_202303091939

使用opencv实现逆傅里叶变换

1
2
3
4
5
6
7
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
idftShift = np.fft.ifftshift(dftShift)
iImg = cv2.idft(idftShift)
iImg = cv2.magnitude(iImg[:, :, 0], iImg[:, :, 1])
get_show(img)
get_show(iImg)

output_17_0_202303091939

output_17_1_202303091939

1
2
3
4
5
6
7
8
9
10
11
12
13
14
cnum = 50
dft = cv2.dft(np.float32(img), flags=cv2.DFT_COMPLEX_OUTPUT)
dftShift = np.fft.fftshift(dft)
rows, cols = img.shape
crow, ccol = rows//2, cols//2
dftShift[:crow-cnum,] = 0
dftShift[crow+cnum:,] = 0
dftShift[:, :ccol-cnum] = 0
dftShift[:, ccol+cnum:] = 0
idftShift = np.fft.ifftshift(dftShift)
iImg = cv2.idft(idftShift)
iImg = cv2.magnitude(iImg[:, :, 0], iImg[:, :, 1])
get_show(img)
get_show(iImg)

output_18_0_202303091939

output_18_1_202303091939

-------------本文结束感谢您的阅读-------------