opencv 同态滤波
时间: 2023-08-21 16:07:01 浏览: 57
同态滤波是一种用于图像增强的技术,它可以同时对图像的低频和高频信息进行调整。在OpenCV中,可以通过使用cv2.filter2D函数来实现同态滤波。
同态滤波的基本原理是对图像进行频域分解,然后对低频和高频部分进行分别处理。通常情况下,低频部分表示图像的整体亮度和对比度信息,而高频部分则表示图像的细节信息。
以下是一个基本的同态滤波示例代码:
```python
import cv2
import numpy as np
def homomorphic_filter(image, gamma_L=0.5, gamma_H=2.0, c=1.0):
# 将图像转换为灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 对灰度图像进行对数变换
log_image = np.log1p(np.float32(gray))
# 对频域图像进行傅里叶变换
fft_image = np.fft.fft2(log_image)
# 创建一个滤波器
rows, cols = gray.shape
center_row, center_col = int(rows/2), int(cols/2)
mask = np.zeros((rows, cols), np.float32)
mask[center_row-30:center_row+30, center_col-30:center_col+30] = 1
# 对频域图像进行滤波操作
filtered_image = fft_image * mask
# 对滤波后的频域图像进行逆傅里叶变换
ifft_image = np.fft.ifft2(filtered_image)
# 对逆傅里叶变换后的图像进行指数变换
exp_image = np.expm1(np.real(ifft_image))
# 对图像进行亮度和对比度调整
result = c * exp_image
result = np.uint8(result)
return result
# 读取图像
image = cv2.imread("input.jpg")
# 进行同态滤波
filtered_image = homomorphic_filter(image)
# 显示原始图像和滤波后的图像
cv2.imshow("Original Image", image)
cv2.imshow("Filtered Image", filtered_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上述代码中,我们首先将图像转换为灰度图像,然后对灰度图像进行对数变换。接下来,我们对变换后的图像进行傅里叶变换,并创建一个滤波器来选择需要保留的频率范围。然后,我们将滤波器应用于频域图像,并进行逆傅里叶变换。最后,对逆变换后的图像进行指数变换,并进行亮度和对比度调整。最终得到的filtered_image即为进行同态滤波后的图像。
请注意,上述代码仅为示例,具体的滤波参数和滤波器的设计可以根据实际需求进行调整。