一、暗通道数学模型:
I(x)=J(x)t(x)+A(1−t(x))I(x)=J(x)t(x)+A(1-t(x)) I(x)=J(x)t(x)+A(1−t(x))
其中: I(x) 是输入的原始图像;J(x)是待输出的去雾图像 ;A 是大气光感值 ;t(x) 是透射率;修正值W=0.95
大气光感值A=暗通道中亮度前0.1值的位置上寻找原图中该点亮度最大的值大气光感值A=暗通道中亮度前0.1值的位置上寻找原图中该点亮度最大的值大气光感值A=暗通道中亮度前0.1值的位置上寻找原图中该点亮度最大的值
透射率t(x)=max(1−wmin(min(I(x)/A)),0.1)透射率t(x)=max(1-w min(min(I(x)/A)),0.1)透射率t(x)=max(1−wmin(min(I(x)/A)),0.1)
J(x)=A+(I−A)/t(x)J(x)=A+(I-A)/t(x)J(x)=A+(I−A)/t(x)
二、实验结果
通过继续实验发现了如下问题
1.暗通道探究
1.对于有雾图像,暗通道保持一定的亮度;对于色彩鲜艳无光点图像暗通道几乎为黑色或亮度很低
2.对于天空、光源等有光点的图像,即使无雾暗通道也保值高亮度
2.在局部区域有雾图片中的滤波核探究
滤波核=2:
滤波核=5:
滤波核=15
3.约束下的暗通道方案解决(2)问题
针对该问题,Meng提出了一种约束下的暗通道,其中:
大气估计A=对三通道各自进行最小值滤波,然后取各通道中最大的值为A分量大气估计A=对三通道各自进行最小值滤波,然后取各通道中最大的值为A分量大气估计A=对三通道各自进行最小值滤波,然后取各通道中最大的值为A分量
通过加入边界C0和C1限制J(x)通过加入边界C0和C1限制J(x)通过加入边界C0和C1限制J(x)
加入L1范式限制透射率t,通过引入μ,使其μ和t交替优化直到收敛加入L1范式限制透射率t,通过引入μ,使其μ和t交替优化直到收敛加入L1范式限制透射率t,通过引入μ,使其μ和t交替优化直到收敛
三、idea-特征融合
通过对于图像不同的滤波核求出不同A,部分代码如下:
dark = cv2.erode(dc,np.ones((sz,sz))) # 偏暗
# -------------------------------------------------------------
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (sz, sz)) # 偏亮
dark = cv2.erode(dc, kernel)
A越高图像越暗;A越低图像越亮
通过简单的卷积神经网络学习对方图片中的特征然后在自身进行特征重构,然后再将两张图片进行特征融合。实验结果如下:
(左 A偏高原图 中 特征融合后原图 右 A偏低原图)
特征提取网络模型如下:
class Encoder(nn.Module):
def __init__(self):
super(Encoder, self).__init__()
self.conv1 = nn.Conv2d(3, 64, kernel_size=3, stride=1, padding=1)
self.relu = nn.ReLU(inplace=True)
def forward(self, x):
x = self.conv1(x)
x = self.relu(x)
return x
class Decoder(nn.Module):
def __init__(self):
super(Decoder, self).__init__()
self.conv2 = nn.Conv2d(64, 3, kernel_size=3, stride=1, padding=1)
self.tanh = nn.Tanh()
def forward(self, x):
x = self.conv2(x)
x = self.tanh(x)
return x