使用傅立叶变换实现登月图片的消噪
具体步骤:
第一步:读取图片数据,使用方法把彩色图片变成黑白图片
第二步:使用傅里叶变换,把图片数据变成频率域数据
第三步:把频率域数据中的高频点(噪点) 赋值为0
第四步:进行傅里叶逆变换
第五步:去虚保实
对图片的消噪处理一般针对于黑白图片,所以需要将图片的三维数据转化为二维数据,即将其中的色彩维度去掉。
#先导入数据处理的常用模块包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# from __future__ import print_function
# from utils import *
import matplotlib.pyplot as plt #plt 用于显示图片
import numpy as np
image_arr = "file:///home/ccoy/Documents/Ipython_Numpy/moonlanding.jpg"
# 第一步:读取图片数据,使用方法把彩色图片变成黑白图片
print("最初的图片(三维)")
moon_initial = plt.imread(image_arr)
#moonlanding.jpg是三维的图片,可以moon.shape查看
display(moon_initial.shape)
plt.imshow(moon_initial)
plt.axis('off') #axis('off'),不显示标度
plt.show()
#通过自定义rgb2gray函数,从三维数据中提取二维,彩色图片变成黑白
def rgb2gray(rgb):
return np.dot(rgb[...,:3], [0.299, 0.587, 0.114])
moon = plt.imread(image_arr).astype(np.float32)/255.0
gray = rgb2gray(moon)
print("提取图片的二维数据之后")
#确定图片数据已经被提取为二维
display(gray.shape)
# 也可以用 plt.imshow(gray, cmap = plt.get_cmap('gray'))
plt.imshow(gray, cmap='Greys_r')
plt.axis('off')
plt.show()
# 第二步:使用傅里叶变换,把图片数据变成频率域数据
#导入傅立叶变换需要的包(fft2模块,返回二维离散傅里叶变换)
from scipy.fftpack import fft2
moon_fft = fft2(gray) #使用fft2模块将上面的图片数据转换为频域数据
# 第三步:把频率域数据中的高频点(噪点) 赋值为0
moon_fft[np.abs(moon_fft) > 8e2] = 0
result = np.where(np.abs(moon_fft) > 8e3, 0, moon_fft)
# 第四步:进行傅里叶逆变换
#导入傅立叶逆变换需要的包
from scipy.fftpack import ifft2
moon_ifft = ifft2(moon_fft) #使用ifft2模块将上面的频域数据进行傅里叶逆变换
# 第五步:去虚保实
moon_cleaned = np.real(moon_ifft) #去虚保实
print("经过傅里叶转换,降噪之后的图片")
#plt.figure(figsize=(10,8))
plt.imshow(moon_cleaned,cmap='Greys_r')
plt.axis('off')
plt.show()
输出与显示:
最初的图片(三维)
(339, 548, 4)
提取图片的二维数据之后
(339, 548)
经过傅里叶转换,降噪之后的图片
仅供参考学习,严禁转载!