目录
1. 简介
全局直方图去雾算法通过对图像的全局统计特征进行分析和处理来去除雾气造成的影响。它是一种简单而有效的基于直方图分析的图像去雾方法,适用于许多实际场景。
该算法的核心思想是通过分析图像的像素值分布情况,将具有较高传输率的像素与雾气影响较大的像素进行区分,这样就增加了像素灰度值的动态范围,从而实现图像的去雾效果。该算法具有简单易懂、计算复杂度低的特点,适用于对整幅图像进行去雾处理。然而,由于全局直方图算法没有考虑到图像的局部信息,对于某些复杂场景下的图像去雾效果可能不理想。
数字图像是离散化的数值矩阵,其直方图可以被视为一个离散函数,它表示数字图像中每一灰度级与其出现概率间的统计关系。通俗地理解,就是直接强行对彩色图像的R,G,B三通道颜色进行histeq均衡处理,然后进行三通道重组;
雾天图像的颜色由雾气浓度和大气光共同决定。根据 Beer-Lambert 定律,雾天图像中像素的颜色与其透射率成反比,因此可以通过估算的大气光和雾密度来去除雾气。
计算:使用下面的模型来恢复无雾图像的每个通道:
J(x)恢复的无雾图像的像素值
I(x)是输入的雾天图像的像素值
A是估算的大气光
t(x)是像素X处的透射率
2. 代码
import cv2
import numpy as np
def hisEqulColor(img):
# 转换为YCrCb色彩空间
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
# 分离通道
channels = list(cv2.split(ycrcb))
# 对Y通道进行直方图均衡化
channels[0] = cv2.equalizeHist(channels[0])
# 合并通道
ycrcb = cv2.merge(channels)
# 转换回BGR色彩空间
result = cv2.cvtColor(ycrcb, cv2.COLOR_YCrCb2BGR)
return result
# 读取图像
im = cv2.imread('foggy.png')
if im is None:
raise FileNotFoundError("The image file was not found. Please check the path.")
# 对图像进行直方图均衡化
eq = hisEqulColor(im)
# 显示原始图像和处理后的图像
cv2.imshow('Original Image', im)
cv2.imshow('Histogram Equalized Image', eq)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存处理后的图像
cv2.imwrite('img_jhh.png', eq)