同态滤波的python代码 结果为rgb图
时间: 2024-03-02 22:05:13 浏览: 159
以下是同态滤波的Python代码实现:
```python
import cv2
import numpy as np
def homomorphic_filter(img, gamma_l, gamma_h, c):
# 将图像转换为浮点数类型
img = np.float32(img)
# 取图像的对数
img_log = np.log(img + 1)
# 进行傅里叶变换
img_fft = np.fft.fft2(img_log)
# 构建高斯滤波器
rows, cols = img.shape
mid_row, mid_col = int(rows/2), int(cols/2)
kernel = np.zeros_like(img)
for i in range(rows):
for j in range(cols):
d = (i-mid_row)**2 + (j-mid_col)**2
kernel[i,j] = (gamma_h - gamma_l) * (1 - np.exp(-c*d/(mid_row**2))) + gamma_l
# 对频谱进行滤波
img_fft_filtered = np.multiply(kernel, img_fft)
# 进行傅里叶反变换
img_ifft = np.real(np.fft.ifft2(img_fft_filtered))
# 取指数
img_exp = np.exp(img_ifft) - 1
# 对图像进行归一化
img_exp = (img_exp - np.min(img_exp)) / (np.max(img_exp) - np.min(img_exp))
# 将图像转换为8位无符号整型
img_out = np.uint8(img_exp * 255)
# 将灰度图像转换为RGB图像
img_out = cv2.cvtColor(img_out, cv2.COLOR_GRAY2RGB)
return img_out
# 加载图像
img = cv2.imread('lena.jpg', cv2.IMREAD_GRAYSCALE)
# 对图像进行同态滤波处理
img_filtered = homomorphic_filter(img, 0.1, 2, 1)
# 显示图像
cv2.imshow('image', img)
cv2.imshow('filtered', img_filtered)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`homomorphic_filter`函数实现了同态滤波的处理过程,`img`参数为输入图像,`gamma_l`和`gamma_h`参数为低频和高频增益,`c`参数为高斯滤波器的带宽。函数首先将输入图像转换为浮点数类型,并取图像的对数,然后进行傅里叶变换。接着根据高斯滤波器的公式构建高斯滤波器,并对频谱进行滤波。最后进行傅里叶反变换和取指数操作,对图像进行归一化并转换为8位无符号整型。最后将灰度图像转换为RGB图像。在主函数中,加载图像并调用`homomorphic_filter`函数进行处理,最后显示原图和处理后的结果。
阅读全文