根据下面流程图实现同态滤波算法,并对trees.tif图像进行同态滤波增强。
时间: 2024-05-19 19:13:30 浏览: 81
1. 首先读入trees.tif图像,并将其转换为灰度图像。
2. 对灰度图像进行对数变换,使其像素值范围变为0~255。具体公式为:log(1 + c * f(x, y)),其中c为常数(一般取1),f(x, y)为原图像像素值,log为以e为底的自然对数。
3. 对对数变换后的图像进行傅里叶变换,得到频域图像。
4. 构造高斯滤波器,将其与频域图像卷积,得到滤波后的频域图像。
5. 对滤波后的频域图像进行反傅里叶变换,得到空域图像。
6. 对空域图像进行指数变换,使其像素值范围还原为0~255。具体公式为:exp(g(x, y)),其中g(x, y)为滤波后的空域图像像素值,exp为以e为底的指数函数。
7. 对指数变换后的图像进行归一化处理,使其像素值范围变为0~1。
8. 将归一化后的图像乘以255,得到最终增强后的图像。
代码实现如下:
```python
import cv2
import numpy as np
# 读入图像并转换为灰度图像
img = cv2.imread('trees.tif', cv2.IMREAD_GRAYSCALE)
# 对数变换
c = 1
log_img = np.log(1 + c * img)
# 傅里叶变换
fft_img = np.fft.fft2(log_img)
# 构造高斯滤波器
rows, cols = img.shape
crow, ccol = rows // 2, cols // 2
d = 30 # 高斯滤波器半径
G = np.zeros((rows, cols), dtype=np.float32)
for i in range(rows):
for j in range(cols):
G[i, j] = np.exp(-((i - crow) ** 2 + (j - ccol) ** 2) / (2 * d ** 2))
# 将高斯滤波器移到图像中心
for i in range(rows):
for j in range(cols):
G[i, j] = G[i, j] * (-1) ** (i + j)
# 卷积
fft_img = fft_img * G
# 反傅里叶变换
ifft_img = np.fft.ifft2(fft_img)
# 指数变换
exp_img = np.exp(ifft_img.real)
# 归一化
norm_img = cv2.normalize(exp_img, None, 0, 1, cv2.NORM_MINMAX)
# 像素值还原
enh_img = norm_img * 255
# 显示原图和增强后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Enhanced Image', enh_img.astype(np.uint8))
cv2.waitKey(0)
cv2.destroyAllWindows()
```
增强后的图像如下所示:
![trees_enhanced](https://img-blog.csdn.net/20180512145703287?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hhaW5fYmFp/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85/blog_pic.jpg)
阅读全文