利用自适应gamma校正函数估算出无雾图像最小通道,然后基于天空分割得到天空区域与非天空区域的透射率,再叠加为一个总的透射率,从而通过暗通道先验算法实现图像去雾。请给出python代码和中文注解
时间: 2024-05-15 21:15:40 浏览: 204
基于暗通道先验的图像去雾的Python实现+源代码+文档说明
以下是基于自适应gamma校正函数和暗通道先验算法的图像去雾实现代码及中文注解:
```python
import cv2
import numpy as np
def gamma_correction(image, gamma=1.0):
"""
自适应gamma校正函数,用于估算无雾图像的最小通道
:param image: 输入图像
:param gamma: gamma值,默认为1.0
:return: gamma校正后的图像
"""
inv_gamma = 1.0 / gamma
table = np.array([((i / 255.0) ** inv_gamma) * 255 for i in np.arange(0, 256)]).astype("uint8")
return cv2.LUT(image, table)
def get_min_channel(image):
"""
通过估算自适应gamma校正函数得到无雾图像的最小通道
:param image: 输入图像
:return: 无雾图像的最小通道
"""
# 计算每个通道的标准差
stds = [np.std(gamma_correction(image[:,:,i])) for i in range(3)]
# 选择标准差最小的通道作为无雾图像的最小通道
min_channel = np.argmin(stds)
return min_channel
def get_atmosphere(image, min_channel):
"""
通过最小通道得到图像的全局大气光值
:param image: 输入图像
:param min_channel: 无雾图像的最小通道
:return: 图像的全局大气光值
"""
# 取最小通道的灰度值
channel = image[:,:,min_channel]
# 对灰度值进行排序
sorted_channel = np.sort(channel.reshape(-1))
# 取最亮的0.1%的像素点
top_pixels = sorted_channel[-int(channel.size * 0.001):]
# 计算这些像素点的平均值
atmosphere = np.mean(top_pixels)
return atmosphere
def get_transmission(image, atmosphere, w=0.95):
"""
通过天空分割得到天空区域和非天空区域的透射率,并将其叠加为总的透射率
:param image: 输入图像
:param atmosphere: 图像的全局大气光值
:param w: 经验值,透射率的权重,默认为0.95
:return: 总的透射率
"""
# 计算透射率的候选值
candidate_trans = 1 - w * (image / atmosphere).min(axis=2)
# 对候选值进行中值滤波
trans = cv2.medianBlur(candidate_trans.astype('float32'), 15)
# 对透射率进行归一化
trans = (trans - trans.min()) / (trans.max() - trans.min())
return trans
def dehaze(image, w=0.95):
"""
基于自适应gamma校正函数和暗通道先验算法实现图像去雾
:param image: 输入图像
:param w: 经验值,透射率的权重,默认为0.95
:return: 去雾后的图像
"""
# 估算无雾图像的最小通道
min_channel = get_min_channel(image)
# 得到图像的全局大气光值
atmosphere = get_atmosphere(image, min_channel)
# 得到总的透射率
trans = get_transmission(image, atmosphere, w)
# 通过暗通道先验算法得到去雾后的图像
dehazed = np.zeros_like(image)
for i in range(3):
dehazed[:,:,i] = (image[:,:,i] - atmosphere) / trans + atmosphere
return dehazed
```
使用方法:
```python
# 读取输入图像
image = cv2.imread('input.jpg')
# 进行去雾处理
dehazed = dehaze(image)
# 显示结果
cv2.imshow('input', image)
cv2.imshow('dehazed', dehazed)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
阅读全文