发布时间:2021-08-26 23:00:25编辑:run阅读(7262)
scipy信号模块的fftconvolve()函数的频域高斯模糊滤波器.
from skimage.io import imread import matplotlib.pylab as pylab import numpy as np from scipy import signal # 指定默认字体 pylab.rcParams['font.sans-serif'] = ['KaiTi'] # 解决保存图像是负号'-'显示为方块的问题 pylab.rcParams['axes.unicode_minus'] = False im = np.mean(imread(r'D:\image_processing\image3\aaq.jpg'), axis=2) print(im.shape) gauss_kernel = np.outer(signal.gaussian(11, 3), signal.gaussian(11, 3)) im_blurred = signal.fftconvolve(im, gauss_kernel, mode='same') fig, (ax_original, ax_kernel, ax_blurred) = pylab.subplots(1, 3, figsize=(20, 8)) ax_original.imshow(im, cmap='gray') ax_original.set_title('原始图像', size=25) ax_original.set_axis_off() ax_kernel.imshow(gauss_kernel) ax_kernel.set_title('高斯核', size=25) ax_kernel.set_axis_off() ax_blurred.imshow(im_blurred, cmap='gray') ax_blurred.set_title('模糊化图像', size=25) ax_blurred.set_axis_off() fig.show()
卷积后如何绘制原始图像和模糊图像的频谱
from skimage.io import imread import scipy.fftpack as fp import matplotlib.pylab as pylab import numpy as np from scipy import signal # 指定默认字体 pylab.rcParams['font.sans-serif'] = ['KaiTi'] # 解决保存图像是负号'-'显示为方块的问题 pylab.rcParams['axes.unicode_minus'] = False im = np.mean(imread(r'D:\image_processing\image3\aaq.jpg'), axis=2) gauss_kernel = np.outer(signal.gaussian(11, 3), signal.gaussian(11, 3)) im_blurred = signal.fftconvolve(im, gauss_kernel, mode='same') print(im.shape) F1 = fp.fft2((im).astype(float)) F2 = fp.fftshift(F1) pylab.figure(figsize=(15, 8)) pylab.subplot(1, 2, 1) pylab.imshow((20*np.log10(0.1+F2)).astype(int), cmap=pylab.cm.gray) pylab.title('原始图像频谱', size=25) F1 = fp.fft2((im_blurred).astype(float)) F2 = fp.fftshift(F1) pylab.subplot(1, 2, 2) pylab.imshow((20*np.log10(0.1+F2)).astype(int), cmap=pylab.cm.gray) pylab.title('模糊图像频谱', size=25) pylab.show()
比较scipy convolve()和fftconvolve()与高斯模糊核的运行时间.可以利用python的timeit模块来比较图像域和频域卷积函数运行时间,由于频域卷积涉及单个矩阵的乘法运算,而不是一系列滑动窗口算法的计算,因此预计它会快的多。以及使用convolve()和fftconvolve()函数的输出结果.
from skimage.io import imread import matplotlib.pylab as pylab import numpy as np import timeit from scipy import signal # 指定默认字体 pylab.rcParams['font.sans-serif'] = ['KaiTi'] # 解决保存图像是负号'-'显示为方块的问题 pylab.rcParams['axes.unicode_minus'] = False im = np.mean(imread(r'D:\image_processing\image3\aaq.jpg'), axis=2) gauss_kernel = np.outer(signal.gaussian(11, 3), signal.gaussian(11, 3)) im_blurred1 = signal.convolve(im, gauss_kernel, mode='same') im_blurred2 = signal.fftconvolve(im, gauss_kernel, mode='same') def wrapper_convolve(func): def weapped_convolve(): return func(im, gauss_kernel, mode='same') return weapped_convolve wrapped_convolve = wrapper_convolve(signal.convolve) wrapped_fftconvolve = wrapper_convolve(signal.fftconvolve) times1 = timeit.repeat(wrapped_convolve, number=1, repeat=100) print(times1) times2 = timeit.repeat(wrapped_fftconvolve, number=1, repeat=100) print(times2) # 以下代码展示了使用convolve()和fftconvolve()函数的输出结果 pylab.figure(figsize=(15, 5)) pylab.gray() pylab.subplot(131) pylab.imshow(im) pylab.title('原始图像', size=25) pylab.axis('off') pylab.subplot(132) pylab.imshow(im_blurred1) pylab.title('卷积输出图像', size=25) pylab.axis('off') pylab.subplot(133) pylab.imshow(im_blurred2) pylab.title('快速傅里叶卷积输出图像', size=25) pylab.axis('off') # 以下代码可视化了运行时间之间的差异,每个函数都在相同高斯核的输入图像上运行100次 # 然后每个函数所花费时间的箱型图被绘制出来 data1 = [times1, times2] pylab.figure(figsize=(8, 6)) box = pylab.boxplot(data1, patch_artist=True) colors = ['cyan', 'pink'] for patch, color in zip(box['boxes'], colors): patch.set_facecolor(color) pylab.xticks(np.arange(3), ('', 'convolve', 'fftconvolve'), size=20) pylab.yticks(fontsize=20) pylab.xlabel('scipy.signal卷积方法', size=20) pylab.ylabel('运行时间', size=20) pylab.show()
可以看到使用convolve()和fftconvolve()函数的输出结果
以下代码可视化了运行时间之间的差异,每个函数都在相同高斯核的输入图像上运行100次,然后每个函数所花费时间的箱型图被绘制出来,可以看到fftconvolve()函数的平均运行速度更快
下一篇: python3-scipy高通滤波器
47742
46232
37103
34622
29224
25880
24740
19859
19413
17903
5711°
6311°
5829°
5883°
6979°
5825°
5841°
6355°
6311°
7669°