发布时间:2021-08-26 23:00:25编辑:run阅读(9173)
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高通滤波器
51177
50586
41209
38033
32497
29402
28263
23117
23082
21410
1461°
2179°
1801°
1727°
2035°
1796°
2477°
4164°
4026°
2878°