3.5 Python图像的频域图像增强-同态滤波器
1 算法原理
同态滤波是一种在频域中同时能够压缩图像的亮度范围和增强图像对比度的方法。下面推导同态滤波的流程:
基于图像成像模型:一幅图像f(x, y)可以表示成它的照度分量i(x, y)与反射分量r(x, y)的乘积。
成像模型(照度和反射) :
f(x,y)=i(x,y)r(x,y)
(1)两边取对数:
lnf(x,y)= lni(x, y) +Inr(x,y)
(2)两边取傅立叶变换:
F(u,v)= I(u,v) + R(u,v)
(3)用一频域函数H(u, v)处理F(u, v): .
H(u,v)F(u,v)= H(u,v)I(u,v)+ H(u,v)R(u,v)
(4)反变换到空域:
(5)两边取指数:
同态滤波器处理流程如下:
H(u, v):同态(homomorphic)滤波器,分别作用于照度分量和反射分量
(1)图像照射分量变化缓慢;反射分量在边缘处变化剧烈
(2)图像对数的傅立叶变换后的低频部分对应照度分量,高频部分对应反射分量
同态滤波器的特点:对高频和低频成分有不同的影响。
2 代码
运行代码说明
1.要改变代码中的图片地址(地址不能有中文)
更改
put(path)
函数中的路径put(r'../image/image1.jpg')
2.注意最后的
plt.savefig('1.new.jpg')
是保存plt图像,如果不使用可以注释掉
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.imread(os.path.join(base, 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('5.new.jpg')
plt.show()
# 图像处理函数,要传入路径
put(r'../image/image3.jpg')