问题:如何去除下面图中规律变化的噪声?
二维图像傅里叶变换(2D FFT)是一种将图像从空间域(时域)转换到频域的方法,其原理是在两个方向上(水平和垂直)分别对图像执行一维傅里叶变换。
二维傅里叶变换的输出是大小为M×N 的幅度谱和相位谱(F(u,v) 的模和辐角)。其中,幅度谱表示了输入信号中频率成分的强度,而相位谱表示了输入信号中每个频率成分的位置信息。
傅里叶变换用于将信号(包括图像信号)转换到频域,其中高频成分代表着信号中的细节和噪声。因此,滤波去除傅里叶变换后频率较高的成分(即高频噪声)可以消除图像中的规律性噪声。使用下图的部分频段滤波:
import cv2
import numpy as np
# 滤波
def Filter(image, d0):
f = np.fft.fft2(image)
fshift = np.fft.fftshift(f)
s1 = np.log(np.abs(fshift))
H = np.empty_like(s1, float)
M, N = image.shape
for x in range(0, M):
for y in range(0, N):
d1 = np.sqrt((x - 331) ** 2 + (y - 293) ** 2)
d2 = np.sqrt((x - 331) ** 2 + (y - 341) ** 2)
if d1 <= d0 or d2 <= d0:
H[x, y] = 0
else:
H[x, y] = 1
new_img = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * H)))
new_img = cv2.normalize(new_img, None, 0, 255, cv2.NORM_MINMAX)
new_img = new_img.astype(np.uint8)
return new_img
if __name__ == "__main__":
img1 = cv2.imread('1-2.png', 0)
img2 = Filter(img1, 8)
cv2.imshow('original1', img1)
cv2.imshow('Processed3', img2)
cv2.imwrite('Processed3.png', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果图:
可以看到,通过对傅里叶变换后幅度谱进行部分滤波,可以消除图像中竖直的规律性噪声,效果不错。相对于单纯的去掉某几个噪点,边缘的黑影也能够很好的去除掉,可以说针对这个问题使用该局部滤波方法效果良好。