图像处理中的一个更高级的主题与傅里叶变换的概念有关。简而言之,一些图像包含用户可能想要去除的系统噪声。如果这种噪声足够规则,使用离散傅里叶变换(DFT/FFT)调整可能有助于图像处理。在本文中,我们将确切地看到如何做到这一点。
本文参考如下博文:Image Processing with Python — Application of Fourier Transformation
import numpy as np
import matplotlib.pyplot as plt
from skimage.io import imread, imshow
from skimage.color import rgb2hsv, rgb2gray, rgb2yuv
from skimage import color, exposure, transform
from skimage.exposure import equalize_hist
dark_image = imread('against_the_light.png')
本文试图找到一种方法来消除(或至少大幅减少)后面的电线。首先将图像转换为灰度图。
dark_image_grey = rgb2gray(dark_image)
plt.figure(num=None, figsize=(8, 6), dpi=80)
plt.imshow(dark_image_grey, cmap='gray');
使用Skimage中的fft函数对图像进行变换。导入代码:
dark_image_grey_fourier = np.fft.fftshift(np.fft.fft2(dark_image_grey))
plt.figure(num=None, figsize=(8, 6), dpi=80)
plt.imshow(np.log(abs(dark_image_grey_fourier)), cmap='gray');
在图像中,可以看到白色的垂直线和水平线,它们是图像中尖锐的水平和垂直元素。
def fourier_masker_ver(image, i):
f_size = 15
dark_image_grey_fourier =
np.fft.fftshift(np.fft.fft2(rgb2gray(image)))
dark_image_grey_fourier[:225, 235:240] = i
dark_image_grey_fourier[-225:,235:240] = i
fig, ax = plt.subplots(1,3,figsize=(15,15))
ax[0].imshow(np.log(abs(dark_image_grey_fourier)), cmap='gray')
ax[0].set_title('Masked Fourier', fontsize = f_size)
ax[1].imshow(rgb2gray(image), cmap = 'gray')
ax[1].set_title('Greyscale Image', fontsize = f_size);
ax[2].imshow(abs(np.fft.ifft2(dark_image_grey_fourier)),
cmap='gray')
ax[2].set_title('Transformed Greyscale Image',
fontsize = f_size);
fourier_masker(dark_image, 1)
def fourier_masker_hor(image, i):
f_size = 15
dark_image_grey_fourier =
np.fft.fftshift(np.fft.fft2(rgb2gray(image)))
dark_image_grey_fourier[235:240, :230] = i
dark_image_grey_fourier[235:240,-230:] = i
fig, ax = plt.subplots(1,3,figsize=(15,15))
ax[0].imshow(np.log(abs(dark_image_grey_fourier)), cmap='gray')
ax[0].set_title('Masked Fourier', fontsize = f_size)
ax[1].imshow(rgb2gray(image), cmap = 'gray')
ax[1].set_title('Greyscale Image', fontsize = f_size);
ax[2].imshow(abs(np.fft.ifft2(dark_image_grey_fourier)),
cmap='gray')
ax[2].set_title('Transformed Greyscale Image',
fontsize = f_size);
fourier_masker_hor(dark_image, 1)
可以看到图像的所有垂直方向都被模糊了。这在电线杆上非常明显。虽然在某些情况下有所帮助,但在这里显然没有帮助。
def fourier_transform_rgb(image):
f_size = 25
transformed_channels = []
for i in range(3):
rgb_fft = np.fft.fftshift(np.fft.fft2((image[:, :, i])))
rgb_fft[:225, 235:237] = 1
rgb_fft[-225:,235:237] = 1
transformed_channels.append(abs(np.fft.ifft2(rgb_fft)))
final_image = np.dstack([transformed_channels[0].astype(int),
transformed_channels[1].astype(int),
transformed_channels[2].astype(int)])
fig, ax = plt.subplots(1, 2, figsize=(17,12))
ax[0].imshow(image)
ax[0].set_title('Original Image', fontsize = f_size)
ax[0].set_axis_off()
ax[1].imshow(final_image)
ax[1].set_title('Transformed Image', fontsize = f_size)
ax[1].set_axis_off()
fig.tight_layout()