用python写图像去雾处理
时间: 2023-08-04 14:17:19 浏览: 128
在Python中进行图像去雾处理可以使用以下步骤:
1. 读取输入图像,将其转换为灰度图像。
2. 计算图像中像素的暗通道先验,即在一个局部窗口内找到最小值。
3. 估计全局大气光照。
4. 根据先前计算的暗通道、全局大气光照和图像中的透射率,进行图像去雾处理。
5. 对输出图像进行后处理,例如调整亮度和对比度等。
以下是一个简单的Python实现:
```python
import cv2
import numpy as np
def dark_channel(img, size):
# 计算暗通道
min_img = cv2.erode(img, np.ones((size, size), np.uint8))
return np.min(min_img, axis=2)
def estimate_a(img, p):
# 估计全局大气光照
height, width, _ = img.shape
num_pixels = height * width
flat_img = img.reshape(num_pixels, 3)
flat_dark = p.flatten()
sort_indices = np.argsort(flat_dark)[::-1]
top_indices = sort_indices[:int(0.1*num_pixels)]
top_pixels = flat_img[top_indices]
return np.max(top_pixels, axis=0)
def estimate_t(img, a, w):
# 估计透射率
normalized_img = img.astype(np.float32) / a.astype(np.float32)
return 1 - w * dark_channel(normalized_img, 15)
def dehaze(img, w=0.95, tmin=0.1):
# 图像去雾处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = gray.astype(np.float32) / 255.0
a = estimate_a(img, gray)
t = estimate_t(img, a, w)
t = np.maximum(t, tmin)
t = cv2.blur(t, (15, 15))
t = np.expand_dims(t, axis=2)
a = np.expand_dims(a, axis=0)
a = np.expand_dims(a, axis=0)
a = np.tile(a, [img.shape[0], img.shape[1], 1])
result = np.divide((img.astype(np.float32) - a), t) + a
result = np.clip(result, 0, 255).astype(np.uint8)
return result
```
使用该函数进行图像去雾处理的示例代码:
```python
img = cv2.imread("input.jpg")
result = dehaze(img)
cv2.imwrite("output.jpg", result)
```
其中,"input.jpg"为输入图像的文件名,"output.jpg"为输出图像的文件名。
阅读全文