发布时间:2021-09-07 00:53:48编辑:run阅读(4978)
scipy-图像复原,要进行图像复原,需对图像退化(degradation)过程进行建模,这样能够在很大程度上消除退化的影响,但面临图像信息和噪声会丢失信息。
图像的基本退化模型:
g(x,y) = h(x,y) * f(x, y) + n(x, y) <---> G(u, v) = H(u, v) * F(u, v) + N(u, v)
然后就可以对模糊的图像使用逆滤波器(即使用相同的H)获得原始图像。
利用FFT去卷积和逆滤波。
假定有已知的具有模糊核的模糊图像,典型的图像处理任务要求就是恢复原始图像,或至少近似于原始图像。我们称这种特殊的图像处理过程为去卷积,有一类朴素滤波器可以应用于频域中来实现逆滤波器的功能,先用高斯模糊对图像进行模糊处理。
from skimage.io import imread import scipy.fftpack as fp from skimage.color import rgb2gray 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 = 255 * rgb2gray(imread(r'D:\image_processing\image3\eeq.jpg')) gauss_kernel = np.outer(signal.gaussian(im.shape[0], 3), signal.gaussian(im.shape[1], 3)) freq = fp.fft2(im) freq_kernel = fp.fft2(fp.ifftshift(gauss_kernel)) convolved = freq * freq_kernel im_blur = fp.ifft2(convolved).real im_blur = 255 * im_blur / np.max(im_blur) # pylab.figure(figsize=(20, 15)) # pylab.imshow(im_blur) # pylab.axis('off') # pylab.show() epsilon = 10 ** -6 freq = fp.fft2(im_blur) freq_kernel = 1 / (epsilon + freq_kernel) convolved = freq * freq_kernel im_restored = fp.ifft2(convolved).real im_restored = 255 * im_restored / np.max(im_restored) print(np.max(im), np.max(im_restored)) pylab.figure(figsize=(10, 10)) pylab.gray() pylab.subplot(221) pylab.imshow(im) pylab.title('原始图像', size=25) pylab.axis('off') pylab.subplot(222) pylab.imshow(im_blur) pylab.title('模糊图像', size=25) pylab.axis('off') pylab.subplot(223) pylab.imshow(im_restored) pylab.title('逆滤波图像复原', size=25) pylab.axis('off') pylab.subplot(224) pylab.imshow(im_restored - im) pylab.title('复原图像和原始图像差异', size=25) pylab.axis('off') pylab.show()
利用维纳滤波器去卷积
如何使用逆滤波器从模糊图像(利用一个已知模糊核)中获得近似原始图像。图像处理的另一项重要任务是从损坏的信号中去噪声,这就是总所周知的图像复原。使用scikit-image restoration模块的无监督维纳滤波器是如何利用去卷积实现图像去噪的。
from skimage.io import imread from skimage import color, data, restoration from scipy.signal import convolve2d as conv2 import matplotlib.pylab as pylab import numpy as np pylab.rcParams['font.sans-serif'] = ['KaiTi'] # 解决保存图像是负号'-'显示为方块的问题 pylab.rcParams['axes.unicode_minus'] = False im = color.rgb2gray(imread(r'D:\image_processing\image3\ccq.jpg')) n = 7 psf = np.ones((n , n)) / n ** 2 im1 = conv2(im, psf, 'same') im1 += 0.1 * np.random.standard_normal(im.shape) im2, _ = restoration.unsupervised_wiener(im1, psf) fig, axes = pylab.subplots(nrows=1, ncols=3, figsize=(20, 4), sharex=True, sharey=True) pylab.gray() axes[0].imshow(im) axes[0].axis('off') axes[0].set_title('原始图像', size=25) axes[1].imshow(im1) axes[1].axis('off') axes[1].set_title('模糊噪声图像', size=25) axes[2].imshow(im2) axes[2].axis('off') axes[2].set_title('自调整恢复图像', size=25) fig.tight_layout() pylab.show()
可以看到原始图像,模糊噪声图像以及使用无监督维纳滤波器复原的自调整图像。
利用FFT实现图像去噪。
利用具有FFT的LPF来阻塞傅里叶元素中的高频分量,以实现图像去噪。
from scipy import stats, fftpack import matplotlib.pylab as pylab from matplotlib.colors import LogNorm import numpy as np pylab.rcParams['font.sans-serif'] = ['KaiTi'] # 解决保存图像是负号'-'显示为方块的问题 pylab.rcParams['axes.unicode_minus'] = False im = pylab.imread(r'D:\image_processing\chapter_3\aapng.png').astype(float) pylab.figure(figsize=(10, 10)) pylab.subplot(221) pylab.imshow(im, pylab.cm.gray) pylab.axis('off') pylab.title('原始图像', size=25) im_fft = fftpack.fft2(im) def plot_spectrum(im_fft): pylab.subplot(222) pylab.imshow(np.abs(im_fft), norm=LogNorm(vmin=5), cmap=pylab.cm.afmhot) pylab.colorbar() plot_spectrum(fftpack.fftshift(im_fft)) pylab.title('傅里叶变换频谱', size=25) pylab.show()
FFT中的滤波器,如何拒绝高频分量,并实现低通滤波器来衰减来自图像的噪声(对应于高频分量)。最终重建图像,使用IFFT从滤波后的傅里叶系数重建图像。
from scipy import stats, fftpack import matplotlib.pylab as pylab import numpy as np from scipy import signal, misc, ndimage pylab.rcParams['font.sans-serif'] = ['KaiTi'] # 解决保存图像是负号'-'显示为方块的问题 pylab.rcParams['axes.unicode_minus'] = False im = pylab.imread(r'D:\image_processing\chapter_3\222.png').astype(float) pylab.figure(figsize=(10, 10)) pylab.subplot(221) pylab.imshow(im, pylab.cm.gray) pylab.axis('off') pylab.title('原始图像', size=25) moon_fft2 = fftpack.fft2(im) cond = np.abs(moon_fft2) > 500 moon_fft2[cond] = 0 moon_ifft2 = fftpack.ifft2(moon_fft2) res = np.real(moon_ifft2) moon3 = ndimage.gaussian_filter(res, sigma=1.5) pylab.subplot(222) pylab.axis('off') pylab.imshow(moon3, cmap='gray') pylab.title('重建后的图像', size=25) pylab.show()
下一篇: python3-PIL图像增强
47528
45843
36833
34367
29000
25633
24488
19647
19151
17672
5503°
6082°
5604°
5674°
6610°
5410°
5412°
5925°
5898°
7211°