用opencv写一个图像去雾算法
时间: 2023-03-20 17:03:22 浏览: 201
图像去雾算法opencv实现
4星 · 用户满意度95%
您好,以下是用OpenCV编写图像去雾算法的示例代码:
```python
import cv2
import numpy as np
def dehaze(img, t_min=0.1, w=0.95):
"""
图像去雾算法
:param img: 待处理图像
:param t_min: 最小透射率阈值
:param w: 气态传输系数
:return: 去雾后的图像
"""
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray = cv2.medianBlur(gray, 3)
# 计算大气光值
height, width = gray.shape
num = height * width // 1000
dark_channel = np.zeros(img.shape[:2], dtype=np.uint8)
for i in range(3):
dark_channel = np.minimum(dark_channel, img[:, :, i])
dark_channel = cv2.medianBlur(dark_channel, 11)
sort_dark_channel = np.sort(dark_channel.reshape(-1))
A = np.mean(sort_dark_channel[-num:])
# 估计透射率
gray = np.float64(gray)
t = 1 - w * (gray / A)
t = np.maximum(t, t_min)
# 估计场景亮度
J = (gray - A) / t + A
J = np.uint8(np.minimum(np.maximum(J, 0), 255))
# 去雾处理
img = np.float64(img)
for i in range(3):
img[:, :, i] = (img[:, :, i] - A) / t + A
img = np.uint8(np.minimum(np.maximum(img, 0), 255))
return img
# 测试代码
if __name__ == '__main__':
img = cv2.imread('test.jpg')
img = dehaze(img)
cv2.imshow('dehaze', img)
cv2.waitKey()
```
该算法首先通过计算图像的暗通道来估计大气光值,然后根据气态传输模型估计透射率,进而估计场景亮度,最后进行去雾处理。可以通过调整参数`t_min`和`w`来控制去雾效果。
阅读全文