代码语言:javascript复制
import os
import numpy as np
import cv2
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
def homomorphic_filter(src,d0=10,r1=0.5,rh=2,c=4,h=2.0,l=0.5):
gray=src.copy()
if len(src.shape)>2:
gray=cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
gray=np.float64(gray)
rows,cols=gray.shape
gray_fft=np.fft.fft2(gray)
gray_fftshift=np.fft.fftshift(gray_fft)
dst_fftshift=np.zeros_like(gray_fftshift)
M, N=np.meshgrid(np.arange(-cols//2,cols//2),np.arange(-rows//2,rows//2))
D=np.sqrt(M**2 N**2)
Z=(rh-r1)*(1-np.exp(-c*(D**2/d0**2))) r1
dst_fftshift=Z*gray_fftshift
dst_fftshift=(h-l)*dst_fftshift l
dst_ifftshift=np.fft.ifftshift(dst_fftshift)
dst_ifft=np.fft.ifft2(dst_ifftshift)
dst=np.real(dst_ifft)
dst=np.uint8(np.clip(dst,0,255))
return dst
def put(path):
image=cv2.imread(path,1)
image=cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
#同态滤波器
h_image=homomorphic_filter(image,d0=10,r1=0.5,rh=2,c=4,h=2.0,l=0.5)
plt.subplot(121)
plt.axis('off')
plt.title('原始图像')
plt.imshow(image,cmap='gray')
plt.subplot(122)
plt.axis('off')
plt.title('同态滤波器图像')
plt.imshow(h_image,'gray')
plt.savefig('C:/Users/xpp/Desktop/result.png')
plt.show()
put(r'C:/Users/xpp/Desktop/Lena.png')
算法:同态滤波器是一种在频域中同时能够压缩图像的亮度范围和增强图像对比度的方法,将像元灰度值看作是照度和反射率两个组份的产物。由于照度相对变化很小,可以看作是图像的低频成份,而反射率则是高频成份。通过分别处理照度和反射率对像元灰度值的影响,达到揭示阴影区细节特征的目的。