发布时间:2021-09-07 00:53:48编辑:run阅读(7574)
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图像增强
51382
50855
41442
38233
32732
29636
28449
23358
23292
21624
1717°
2446°
2042°
1977°
2327°
2009°
2718°
4551°
4358°
3107°