大家好,我是带我去滑雪!
随着科学技术的不断发展,信息的交流和获取已不再受到时空的限制,已经成为人们日常生活中不可或缺的一部分。图像作为人类信息交流中的重要载体,起着不可替代的作用。频谱图像去噪复原方法是一种基于频域的图像处理技术,通过对图像的频谱进行分析和修复来实现去噪和复原。其基本原理是利用图像的频谱特性对噪声进行滤波或修复,然后通过逆变换将处理后的频谱转换回空域得到修复后的图像。在频域中,可以分析图像的频谱特性。频谱表示了图像中不同频率成分的能量分布情况。通过观察频谱,可以了解图像中的噪声和信号特征,从而有针对性地进行修复。根据噪声的特征,在频域中对图像的频谱进行滤波,可以设计相应的滤波器来减弱或去除噪声成分。常用的频域滤波方法包括低通滤波、高通滤波、带通滤波等,它们可以根据噪声频率范围选择适当的滤波器。
本期使用约束最小二乘方滤波法对图像进行去噪还原,该方法基于最小二乘方准则,可以有效克服逆波算法的不稳定性,并在应用滤波过程中加入一些额外的约束条件,以改善噪声去除效果。下面开始python实战!
import cv2
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
def getMotionDsf(shape, angle, dist):
xCenter = (shape[0] - 1) / 2
yCenter = (shape[1] - 1) / 2
sinVal = np.sin(angle * np.pi / 180)
cosVal = np.cos(angle * np.pi / 180)
PSF = np.zeros(shape)
for i in range(dist):
xOffset = round(sinVal * i)
yOffset = round(cosVal * i)
PSF[int(xCenter - xOffset), int(yCenter + yOffset)] = 1
return PSF / PSF.sum()
def makeBlurred(image, PSF, eps):
fftImg = np.fft.fft2(image)
fftPSF = np.fft.fft2(PSF) + eps
fftBlur = np.fft.ifft2(fftImg * fftPSF)
fftBlur = np.abs(np.fft.fftshift(fftBlur))
return fftBlur
def wienerFilter(input, PSF, eps, K=0.01):
fftImg = np.fft.fft2(input)
fftPSF = np.fft.fft2(PSF) + eps
fftWiener = np.conj(fftPSF) / (np.abs(fftPSF)**2 + K)
imgWienerFilter = np.fft.ifft2(fftImg * fftWiener)
imgWienerFilter = np.abs(np.fft.fftshift(imgWienerFilter))
return imgWienerFilter
def getPuv(image):
h, w = image.shape[:2]
hPad, wPad = h - 3, w - 3
pxy = np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]])
pxyPad = np.pad(pxy, ((hPad//2, hPad - hPad//2), (wPad//2, wPad - wPad//2)), mode='constant')
fftPuv = np.fft.fft2(pxyPad)
return fftPuv
def leastSquareFilter(image, PSF, eps, gamma=0.01):
fftImg = np.fft.fft2(image)
fftPSF = np.fft.fft2(PSF)
conj = fftPSF.conj()
fftPuv = getPuv(image)
# absConj = np.abs(fftPSF) ** 2
Huv = conj / (np.abs(fftPSF)**2 + gamma * (np.abs(fftPuv)**2))
ifftImg = np.fft.ifft2(fftImg * Huv)
ifftShift = np.abs(np.fft.fftshift(ifftImg))
imgLSFilter = np.uint8(cv2.normalize(np.abs(ifftShift), None, 0, 255, cv2.NORM_MINMAX))
return imgLSFilter
img = cv2.imread('Fig0526a.png',0)
hImg, wImg = img.shape[:2]
PSF = getMotionDsf((hImg, wImg), 45, 100)
imgBlurred = np.abs(makeBlurred(img, PSF, 1e-6))
scale = 0.01
noisy = imgBlurred.std() * np.random.normal(loc=0.0, scale=scale, size=imgBlurred.shape)
imgBlurNoisy = imgBlurred + noisy
imgWienerFilter = wienerFilter(imgBlurNoisy, PSF, scale, K=0.01)
imgLSFilter = leastSquareFilter(imgBlurNoisy, PSF, scale, gamma=0.01)
plt.figure(figsize=(9, 7))
plt.subplot(231), plt.title("blurred image (dev=0.01)"), plt.axis('off'), plt.imshow(imgBlurNoisy, 'gray')
plt.subplot(232), plt.title("Wiener filter"), plt.axis('off'), plt.imshow(imgWienerFilter, 'gray')
plt.subplot(233), plt.title("least square filter"), plt.axis('off'), plt.imshow(imgLSFilter, 'gray')
scale = 0.1
noisy = imgBlurred.std() * np.random.normal(loc=0.0, scale=scale, size=imgBlurred.shape)
imgBlurNoisy = imgBlurred + noisy
imgWienerFilter = wienerFilter(imgBlurNoisy, PSF, scale, K=0.01)
imgLSFilter = leastSquareFilter(imgBlurNoisy, PSF, scale, gamma=0.1)
plt.subplot(234), plt.title("blurred image (dev=0.1)"), plt.axis('off'), plt.imshow(imgBlurNoisy, 'gray')
plt.subplot(235), plt.title("Wiener filter"), plt.axis('off'), plt.imshow(imgWienerFilter, 'gray')
plt.subplot(236), plt.title("least square filter"), plt.axis('off'), plt.imshow(imgLSFilter, 'gray')
plt.tight_layout()
plt.savefig("squares2.png",
bbox_inches ="tight",
pad_inches = 1,
transparent = True,
facecolor ="w",
edgecolor ='w',
dpi=300,
orientation ='landscape')
输出结果:
更多优质内容持续发布中,请移步主页查看。
点赞+关注,下次不迷路!