一般情况下无雾图像在大部分的行上像素的变化应该是蛮剧烈的,但是如果是有雾的话,每行像素之间的像素差就会有很大程度的缩小,甚至几乎一样
而且有雾图像可以认为是无雾图像与灰白色素的加权平均得到,在本文中,不能去顶灰白像素值是多少,可以近似的认为是有雾图像像素加20左右,而且权重随雾的浓度不同而改变,在这里,我近似认为当每个像素点的像素值与每行的像素值的平均值相差不大时,认为在此点处,雾的浓度很大,也就是雾的浓度(也可看做灰白像素值在此点的权重)与此点和此点所在行的像素平均值的差成反比,因此每一个像素点的像素和灰白像素的权重
计算公式为:
(pixel1[i]+20)*(1.0-fabs((distAvg[w][i]-avg[i]))/avg[i])*alta)
pixel1[i]为图像每个像素点三通道各自的像素值
pixel1[i]+20当做目前的灰白色像素值(注:取一个合适的值与pixel1[i]相加当做灰白色的像素值,想过会更好)
(1.0-fabs((distAvg[w][i]-avg[i]))/avg[i])*alta计算灰白色像素值的权重
distAvg[w][i]是当前像素点得i通道的像素值
avg[i]为此点所在行的平均像素值
alta是权重系数,取不同的权重系数会对结果有影响,因此这里去一个合适的权重系数对结果会有很大的优化作用
因为前文所说雾的浓度(也可看做灰白像素值在此点的权重)与此点和此点所在行的像素平均值的差成反比,所以这里要用1.0减去刚才所算的值,即可得到雾的权重,
然后利用公式
(int) (pixel1[i] - (pixel1[i]+20)*(1.0-fabs((distAvg[w][i]-avg[i]))/avg[i])*alta)/(1.0-(1.0-fabs((distAvg[w][i]-avg[i]))/avg[i])*alta);
即可得到源图像即无雾图像此点的像素值
这种方法的几点限制:
1.对于无雾图像中本来一行像素差别不大的行检测不了,会误以为是浓度很大的行
2.对于alta的最有取值很难确定,所以效果也很难达到最优
3.对于雾浓度很强的区域去雾效果不是很明显
4.部分区域去雾效果很好,但是部分区域效果会失真
原图:
先贴出几张效果图:
alta取0.68时的效果图
alta取0.78时的效果图
alta取0.88时的效果图
从几张效果图可知,随着alta取值的增大,去雾的效果会很明显,但是同时也会带来很多的图像失真
这个只是自己想得一个不成熟的去雾方法,在网上看过一个基于暗通道优先法则的图像去雾方法,这个效果很好,但是没弄明白暗通道优先法则具体算法是怎么样的,上网搜索也没搜到,如果各位过客有懂得,也教一下小弟啊,也欢迎对本文中得方法给出批评建议
源代码: