基于暗通道先验的图像去雾算法解析与实现
创作时间:
作者:
@小白创作中心
基于暗通道先验的图像去雾算法解析与实现
引用
CSDN
1.
https://blog.csdn.net/hhhhhhhhhhwwwwwwwwww/article/details/145707812
图像去雾是计算机视觉领域的重要研究方向之一,广泛应用于摄影、遥感、自动驾驶等领域。基于暗通道先验的图像去雾算法是目前最常用的算法之一,其核心思想是利用无雾图像中局部区域至少存在一个颜色通道的像素值趋近于零的特性来恢复清晰图像。本文将详细介绍该算法的原理和实现步骤。
一、算法背景
何凯明团队于2009年提出的暗通道先验去雾算法《single image haze removal using dark channel prior》,通过统计发现:在无雾图像的局部区域中,至少存在一个颜色通道的像素值趋近于零。这一发现为图像去雾提供了重要的理论依据,其数学模型可表示为:
I(x) = J(x)t(x) + A(1 - t(x))
其中:
- I(x):观测到的有雾图像
- J(x):待恢复的无雾图像
- t(x):透射率
- A:全局大气光值
二、算法原理
1. 暗通道计算
通过取RGB三通道最小值并进行形态学腐蚀操作:
def dark_channel(img, size=15):
r, g, b = cv2.split(img)
min_img = cv2.min(r, cv2.min(g, b))
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (size, size))
return cv2.erode(min_img, kernel)
2. 大气光估计
选取图像中最亮像素的0.1%作为大气光值:
def get_atmo(img, percent=0.001):
mean_perpix = np.mean(img, axis=2).reshape(-1)
mean_topper = mean_perpix[:int(img.shape[0] * img.shape[1] * percent)]
return np.mean(mean_topper)
3. 透射率估计
t(x) = 1 - ω ⋅ dark_channel(I/A)
def get_trans(img, atom, w=0.95):
x = img / atom
return 1 - w * dark_channel(x, 7)
4. 引导滤波优化
使用灰度图作为引导图像进行透射率优化:
# 引导滤波
def guided_filter(p, i, r, e):
"""
:param p: input image
:param i: guidance image
:param r: radius
:param e: regularization
:return: filtering output q
"""
# 1
mean_I = cv2.boxFilter(i, cv2.CV_64F, (r, r))
mean_p = cv2.boxFilter(p, cv2.CV_64F, (r, r))
corr_I = cv2.boxFilter(i * i, cv2.CV_64F, (r, r))
corr_Ip = cv2.boxFilter(i * p, cv2.CV_64F, (r, r))
# 2
var_I = corr_I - mean_I * mean_I
cov_Ip = corr_Ip - mean_I * mean_p
# 3
a = cov_Ip / (var_I + e)
b = mean_p - a * mean_I
# 4
mean_a = cv2.boxFilter(a, cv2.CV_64F, (r, r))
mean_b = cv2.boxFilter(b, cv2.CV_64F, (r, r))
# 5
q = mean_a * i + mean_b
return q
三、完整实现代码
import cv2
import numpy as np
import os
# 计算雾化图像的暗通道
def dark_channel(img, size=15):
r, g, b = cv2.split(img)
min_img = cv2.min(r, cv2.min(g, b)) # 取最暗通道
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (size, size))
dc_img = cv2.erode(min_img, kernel)
return dc_img
# 估计全局大气光值
def get_atmo(img, percent=0.001):
mean_perpix = np.mean(img, axis=2).reshape(-1)
mean_topper = mean_perpix[:int(img.shape[0] * img.shape[1] * percent)]
return np.mean(mean_topper)
# 估算透射率图
def get_trans(img, atom, w=0.95):
x = img / atom
t = 1 - w * dark_channel(x, 15)
return t
# 引导滤波
def guided_filter(p, i, r, e):
"""
:param p: input image
:param i: guidance image
:param r: radius
:param e: regularization
:return: filtering output q
"""
# 1
mean_I = cv2.boxFilter(i, cv2.CV_64F, (r, r))
mean_p = cv2.boxFilter(p, cv2.CV_64F, (r, r))
corr_I = cv2.boxFilter(i * i, cv2.CV_64F, (r, r))
corr_Ip = cv2.boxFilter(i * p, cv2.CV_64F, (r, r))
# 2
var_I = corr_I - mean_I * mean_I
cov_Ip = corr_Ip - mean_I * mean_p
# 3
a = cov_Ip / (var_I + e)
b = mean_p - a * mean_I
# 4
mean_a = cv2.boxFilter(a, cv2.CV_64F, (r, r))
mean_b = cv2.boxFilter(b, cv2.CV_64F, (r, r))
# 5
q = mean_a * i + mean_b
return q
def dehaze(im):
img = im.astype('float64') / 255
img_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY).astype('float64') / 255
atom = get_atmo(img)
trans = get_trans(img, atom)
trans_guided = guided_filter(trans, img_gray, 20, 0.0001)
trans_guided = cv2.max(trans_guided, 0.25)
result = np.empty_like(img)
for i in range(3):
result[:, :, i] = (img[:, :, i] - atom) / trans_guided + atom
return result * 255
if __name__ == '__main__':
image_path= 'images/img.png'
im = cv2.imread(image_path)
img = im.astype('float64') / 255
img_gray = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY).astype('float64') / 255
atom = get_atmo(img)
trans = get_trans(img, atom)
trans_guided = guided_filter(trans, img_gray, 10, 0.0001)
trans_guided = cv2.max(trans_guided, 0.25)
result = np.empty_like(img)
for i in range(3):
result[:, :, i] = (img[:, :, i] - atom) / trans_guided + atom
cv2.imwrite('images/img.png', result * 255)
热门推荐
中法艺术交流的先驱:五位艺术家的传奇人生
粉色大衣搭配哪些粉色内搭才更惊艳?
张博演绎乔映霁,演技炸裂!
乔映霁VS乔映霞:谁更能代表晋商家国情怀?
《诚忠堂》乔映霁:一位理想主义者的悲剧与辉煌
四川省米易县全方位旅游攻略:精选线路、热门景点及特色体验一览
三国时期六大奇才,各个都神通广大,绰号霸气侧漏,你认识几个?
食管炎最佳治疗方法
脚后跟干裂?盐酸阿莫洛芬乳膏不是最佳选择
来海南儋州过年,这篇攻略就够了!
《诚忠堂》揭秘辛亥革命背后的晋商家族
麦新与《大刀进行曲》:抗战经典永流传
分享小表情符号的大故事
张博新剧《诚忠堂》引爆热议
《诚忠堂》PK《延禧攻略》,谁才是真正的清宫大戏?
无人机+无线图传:全高清无线数字图像传输系统技术详解
钱三强与中科院:中国原子弹研制的幕后功臣
耳朵为什么容易发炎
罗布泊:中国首颗原子弹爆炸背后的故事
老话说“除夕三不空,来年不受穷”,是哪三不空?龙年赢个好兆头
《诚忠堂》:辛亥革命中的晋商传奇
粟裕:战场上的“活诸葛”
牛膝种植技巧大揭秘,药用价值知多少?
牛膝:中药界的免疫调节高手
办公室小伤口应急处理全攻略
小伤口处理,你真的做对了吗?
台风后小伤口处理,专业医生支招
衡水市多部门联动协作开展燃气管道泄漏应急演练
张博演技炸裂,《诚忠堂》成年度黑马
《诚忠堂》里的辛亥革命:乔映霁的家国情怀