diff --git a/Butterworth.py b/Butterworth.py new file mode 100644 index 0000000..f772be2 --- /dev/null +++ b/Butterworth.py @@ -0,0 +1,75 @@ +import cv2 as cv +import numpy as np + +def filter(img, D0, W=None, N=2, type='lp', filter='butterworth'): + ''' + 频域滤波器 + Args: + img: 灰度图片 + D0: 截止频率 + W: 带宽 + N: butterworth和指数滤波器的阶数 + type: lp, hp, bp, bs即低通、高通、带通、带阻 + filter:butterworth、ideal、exponential即巴特沃斯、理想、指数滤波器 + Returns: + imgback:滤波后的图像 + ''' + + #离散傅里叶变换 + dft=cv.dft(np.float32(img),flags=cv.DFT_COMPLEX_OUTPUT) + #中心化 + dtf_shift=np.fft.fftshift(dft) + + rows,cols=img.shape + crow,ccol=int(rows/2),int(cols/2) #计算频谱中心 + mask=np.ones((rows,cols,2)) #生成rows行cols列的2纬矩阵 + for i in range(rows): + for j in range(cols): + D = np.sqrt((i-crow)**2+(j-ccol)**2) + if(filter.lower() == 'butterworth'): + if(type == 'lp'): + mask[i, j] = 1/(1+(D/D0)**(2*N)) + elif(type == 'hp'): + mask[i, j] = 1/(1+(D0/D)**(2*N)) + elif(type == 'bs'): + mask[i, j] = 1/(1+(D*W/(D**2-D0**2))**(2*N)) + elif(type == 'bp'): + mask[i, j] = 1/(1+((D**2-D0**2)/D*W)**(2*N)) + else: + assert('type error') + elif(filter.lower() == 'ideal'): #理想滤波器 + if(type == 'lp'): + if(D > D0): + mask[i, j] = 0 + elif(type == 'hp'): + if(D < D0): + mask[i, j] = 0 + elif(type == 'bs'): + if(D > D0 and D < D0+W): + mask[i, j] = 0 + elif(type == 'bp'): + if(D < D0 and D > D0+W): + mask[i, j] = 0 + else: + assert('type error') + elif(filter.lower() == 'exponential'): #指数滤波器 + if(type == 'lp'): + mask[i, j] = np.exp(-(D/D0)**(2*N)) + elif(type == 'hp'): + mask[i, j] = np.exp(-(D0/D)**(2*N)) + elif(type == 'bs'): + mask[i, j] = np.exp(-(D*W/(D**2 - D0**2))**(2*N)) + elif(type == 'bp'): + mask[i, j] = np.exp(-((D**2 - D0**2)/D*W)**(2*N)) + else: + assert('type error') + + fshift = dtf_shift*mask + + f_ishift=np.fft.ifftshift(fshift) + img_back=cv.idft(f_ishift) + img_back=cv.magnitude(img_back[:,:,0],img_back[:,:,1]) #计算像素梯度的绝对值 + img_back=np.abs(img_back) + img_back=(img_back-np.amin(img_back))/(np.amax(img_back)-np.amin(img_back)) + + return img_back \ No newline at end of file diff --git a/Filtering_Butterworth.py b/Filtering_Butterworth.py new file mode 100644 index 0000000..4b5f048 --- /dev/null +++ b/Filtering_Butterworth.py @@ -0,0 +1,38 @@ +import cv2 +import numpy as np +import matplotlib.pyplot as plt +plt.rcParams['font.sans-serif'] = ['simHei'] +plt.rcParams['axes.unicode_minus'] = False +from Butterworth import filter + +# 读取照片 +image_characterTestPattern2 = cv2.imread("file/characterTestPattern2.jpg", cv2.IMREAD_GRAYSCALE) + +# 利用巴特沃斯滤波器进行处理 +image_characterTestPattern2_Butterworth1 = filter(image_characterTestPattern2, 10, type='lp') +image_characterTestPattern2_Butterworth2 = filter(image_characterTestPattern2, 100, type='lp') +image_characterTestPattern2_Butterworth3 = filter(image_characterTestPattern2, 1000, type='lp') + +# 展示图像 +plt.subplot(2,2,1) +plt.imshow(image_characterTestPattern2, cmap='gray') +plt.title('原图') +plt.axis('off') + +plt.subplot(2,2,2) +plt.imshow(image_characterTestPattern2_Butterworth1, cmap='gray') +plt.title('D0 = 10') +plt.axis('off') + +plt.subplot(2,2,3) +plt.imshow(image_characterTestPattern2_Butterworth2, cmap='gray') +plt.title('D0 = 100') +plt.axis('off') + +plt.subplot(2,2,4) +plt.imshow(image_characterTestPattern2_Butterworth3, cmap='gray') +plt.title('D0 = 1000') +plt.axis('off') + +plt.tight_layout() +plt.show() \ No newline at end of file diff --git a/Result_Photo_Filtering/2.Butterworth10.png b/Result_Photo_Filtering/2.Butterworth10.png new file mode 100644 index 0000000..7bc828d Binary files /dev/null and b/Result_Photo_Filtering/2.Butterworth10.png differ diff --git a/Result_Photo_Filtering/2.Butterworth100.png b/Result_Photo_Filtering/2.Butterworth100.png new file mode 100644 index 0000000..eee9912 Binary files /dev/null and b/Result_Photo_Filtering/2.Butterworth100.png differ diff --git a/Result_Photo_Filtering/2.Butterworth1000.png b/Result_Photo_Filtering/2.Butterworth1000.png new file mode 100644 index 0000000..f337768 Binary files /dev/null and b/Result_Photo_Filtering/2.Butterworth1000.png differ diff --git a/Result_Photo_Filtering/2.Butterworth_All.png b/Result_Photo_Filtering/2.Butterworth_All.png new file mode 100644 index 0000000..14e0b5f Binary files /dev/null and b/Result_Photo_Filtering/2.Butterworth_All.png differ